Skip to content

Commit

Permalink
Merge pull request #1 from decentorganization/feature/campaign-update
Browse files Browse the repository at this point in the history
Feature/campaign update
  • Loading branch information
parkermccurley committed Jan 20, 2018
2 parents a94ff81 + d273bff commit 49326e6
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 161 deletions.
93 changes: 61 additions & 32 deletions contracts/SignalTokenProtocol.sol
Expand Up @@ -6,28 +6,36 @@ import './SignalToken.sol';
contract SignalTokenProtocol {
struct Campaign {
address advertiser;
address publisher;
address executor;
uint amount;
uint limit;
string title;
string description;
string contentUrl;
uint256 reward;
uint256 budget;
}

mapping(uint => Campaign) public campaigns;
uint public numberOfCampaigns;
mapping(uint256 => Campaign) public campaigns;
uint256[] public campaignsTable;

SignalToken public signalToken;

modifier isExecutor(uint campaignId) {
Campaign storage campaign = campaigns[campaignId];
function SignalTokenProtocol() public {
signalToken = new SignalToken(this);
}

if (msg.sender == campaign.executor) {
_;
}
function getCampaignsCount()
public
view
returns (uint256)
{
return campaignsTable.length;
}

function SignalTokenProtocol() public {
numberOfCampaigns = 0;
signalToken = new SignalToken(this);
function getSignalTokenAddress()
public
constant
returns (SignalToken)
{
return signalToken;
}

function faucet()
Expand All @@ -38,49 +46,70 @@ contract SignalTokenProtocol {
}

function createCampaign(
address publisher,
address executor,
uint amount,
uint limit
string title,
string description,
string contentUrl,
uint256 reward,
uint256 budget
)
public
returns (uint campaignId)
returns (uint256 campaignId)
{
campaignId = numberOfCampaigns++;
campaigns[campaignId] = Campaign(msg.sender, publisher, executor, amount, limit);
campaignId = campaignsTable.length++;
campaignsTable[campaignId] = campaignId;

campaigns[campaignId] = Campaign(
msg.sender,
title,
description,
contentUrl,
reward,
budget
);

return campaignId;
}

function getCampaign(uint campaignId)
function getCampaign(uint256 campaignId)
public
view
returns (address advertiser, address publisher, address executor, uint amount, uint limit)
returns (
address advertiser,
string title,
string description,
string contentUrl,
uint256 reward,
uint256 budget
)
{
Campaign storage campaign = campaigns[campaignId];

advertiser = campaign.advertiser;
publisher = campaign.publisher;
executor = campaign.executor;
amount = campaign.amount;
limit = campaign.limit;
title = campaign.title;
description = campaign.description;
contentUrl = campaign.contentUrl;
reward = campaign.reward;
budget = campaign.budget;

return (advertiser, title, description, contentUrl, reward, budget);
}

function executeCampaign(uint campaignId)
function executeCampaign(uint256 campaignId, address publisher)
public
isExecutor(campaignId)
returns (bool)
{
Campaign storage campaign = campaigns[campaignId];
return executeTransfer(campaign.advertiser, campaign.publisher, campaign.amount);
return executeTransfer(campaign.advertiser, publisher, campaign.reward);
}

function executeTransfer(
address advertiser,
address publisher,
uint amount
uint256 reward
)
private
returns (bool)
{
return signalToken.transferFrom(advertiser, publisher, amount);
return signalToken.transferFrom(advertiser, publisher, reward);
}
}
175 changes: 46 additions & 129 deletions test/SignalTokenProtocolTest.js
Expand Up @@ -6,20 +6,22 @@ contract("SignalTokenProtocol", function(accounts) {
let signalTokenProtocol;
let signalToken;
let advertiser;
let publisher;
let executor;
let amount;
let limit;
let title;
let description;
let contentUrl;
let reward;
let budget;

beforeEach(function() {
return SignalTokenProtocol.new()
.then(function(instance) {
signalTokenProtocol = instance;
advertiser = accounts[1];
publisher = accounts[2];
executor = accounts[3];
amount = 42;
limit = 420;
title = "Test";
description = "A test campaign.";
contentUrl = "www.ethereum.org";
reward = 42;
budget = 420;
return signalTokenProtocol.signalToken();
})
.then(function(signalTokenAddress) {
Expand Down Expand Up @@ -58,154 +60,69 @@ contract("SignalTokenProtocol", function(accounts) {
});

it("should allow an advertiser to create a campaign", function() {
let numberOfCampaignsStarting;
let numberOfCampaignsEnding;
let campaignsCountStarting;
let campaignsCountEnding;

return signalTokenProtocol.numberOfCampaigns.call()
.then(function(numberOfCampaigns) {
numberOfCampaignsStarting = numberOfCampaigns.toNumber();
return signalTokenProtocol.getCampaignsCount.call()
.then(function(campaignsCount) {
campaignsCountStarting = campaignsCount.toNumber();
return signalTokenProtocol.createCampaign(
publisher,
executor,
amount,
limit,
title,
description,
contentUrl,
reward,
budget,
{ from: advertiser }
);
})
.then(function() {
return signalTokenProtocol.numberOfCampaigns.call();
return signalTokenProtocol.getCampaignsCount.call();
})
.then(function(numberOfCampaigns) {
numberOfCampaignsEnding = numberOfCampaigns.toNumber();
.then(function(campaignsCount) {
campaignsCountEnding = campaignsCount.toNumber();
assert.equal(
numberOfCampaignsEnding,
numberOfCampaignsStarting + 1,
campaignsCountEnding,
campaignsCountStarting + 1,
"no campaigns were created"
);
});
});

it("should create a campaign with a specified advertiser, publisher, executor, and value", function() {
it("should create a campaign with a specified advertiser, reward, and budget", function() {
const campaignId = 0;

let _advertiser;
let _publisher;
let _executor;
let _amount;
let _title;
let _description;
let _contentUrl;
let _reward;
let _budget;

return signalTokenProtocol.createCampaign(
publisher,
executor,
amount,
limit,
title,
description,
contentUrl,
reward,
budget,
{ from: advertiser }
)
.then(function() {
return signalTokenProtocol.getCampaign(campaignId);
})
.then(function(campaign) {
_advertiser = campaign[0];
_publisher = campaign[1];
_executor = campaign[2];
_amount = campaign[3];
_limit = campaign[4];
_title = campaign[1];
_description = campaign[2];
_contentUrl = campaign[3];
_reward = campaign[4];
_budget = campaign[5];

assert.equal(_advertiser, advertiser, "campaign does not have correct advertiser");
assert.equal(_publisher, publisher, "campaign does not have correct publisher");
assert.equal(_executor, executor, "campaign does not have correct implementation");
assert.equal(_amount, amount, "campaign does not have correct amount");
assert.equal(_limit, limit, "campaign does not have correct limit");
});
});

it("should allow an executor to execute a campaign", function () {
const campaignId = 0;

let advertiserStartingBalance;
let advertiserEndingBalance;

let publisherStartingBalance;
let publisherEndingBalance;

let executorStartingBalance;
let executorEndingBalance;

let _advertiser;
let _publisher;
let _executor;
let _amount;
let _limit;

return signalTokenProtocol.faucet({ from: advertiser })
.then(function() {
return signalToken.balanceOf(advertiser);
})
.then(function(balance) {
advertiserStartingBalance = balance.toNumber();
return signalToken.balanceOf(publisher);
})
.then(function(balance) {
publisherStartingBalance = balance.toNumber();
return signalToken.balanceOf(executor);
})
.then(function(balance) {
executorStartingBalance = balance.toNumber();
return signalToken.approve(
signalTokenProtocol.address,
limit,
{ from: advertiser }
);
})
.then(function() {
return signalTokenProtocol.createCampaign(
publisher,
executor,
amount,
limit,
{ from: advertiser }
);
})
.then(function() {
return signalTokenProtocol.getCampaign(campaignId);
})
.then(function(campaign) {
_advertiser = campaign[0];
_publisher = campaign[1];
_executor = campaign[2];
_amount = campaign[3];
_limit = campaign[4];

return signalTokenProtocol.executeCampaign(campaignId, { from: executor });
})
.then(function() {
return signalToken.balanceOf(_advertiser);
})
.then(function(balance) {
advertiserEndingBalance = balance.toNumber();
return signalToken.balanceOf(_publisher);
})
.then(function(balance) {
publisherEndingBalance = balance.toNumber();
return signalToken.balanceOf(_executor);
})
.then(function(balance) {
executorEndingBalance = balance.toNumber();

assert.equal(
advertiserEndingBalance,
advertiserStartingBalance - _amount,
"advertiser ending balance is not the expected result after campaign execution"
);
assert.equal(
publisherEndingBalance,
publisherStartingBalance + _amount,
"advertiser ending balance is not the expected result after campaign execution"
);
assert.equal(
executorEndingBalance,
executorStartingBalance,
"advertiser ending balance is not the expected result after campaign execution"
);
assert.equal(_title, title, "campaign does not have correct amount");
assert.equal(_description, description, "campaign does not have correct limit");
assert.equal(_contentUrl, contentUrl, "campaign does not have correct limit");
assert.equal(_reward, reward, "campaign does not have correct amount");
assert.equal(_budget, budget, "campaign does not have correct limit");
});
});
});

0 comments on commit 49326e6

Please sign in to comment.