Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
enkogu committed Jan 5, 2019
1 parent e36e164 commit c3454f6
Show file tree
Hide file tree
Showing 27 changed files with 375 additions and 64 deletions.
35 changes: 30 additions & 5 deletions contracts/bases/ExpenseBase.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ import "zeppelin-solidity/contracts/ownership/Ownable.sol";
*/
contract ExpenseBase is ExpenseLib, IReceiver, Ownable {
Expense public expense;

constructor(uint128 _totalNeeded, uint128 _minAmount, uint32 _partsPerMillion, uint32 _periodHours, bool _isSlidingAmount, bool _isPeriodic) public {
expense = _constructExpense(_totalNeeded, _minAmount, _partsPerMillion, _periodHours, _isSlidingAmount, _isPeriodic);
}

function getReceiverType() public view returns(Type) {
if(0 != expense.partsPerMillion) {
Expand Down Expand Up @@ -48,14 +52,35 @@ contract ExpenseBase is ExpenseLib, IReceiver, Ownable {
return _isNeeds(expense);
}

function setNeededWei(uint _totalNeeded) public onlyOwner {
emit ExpenseSetNeeded(_totalNeeded);
expense.totalNeeded = uint128(_totalNeeded);
function setTotalNeeded(uint128 _totalNeeded) public onlyOwner {
require(expense.partsPerMillion == 0);
require(_totalNeeded > 0);
require(expense.minAmount <= _totalNeeded);
if(expense.minAmount != 0) {
require((_totalNeeded % expense.minAmount) == 0);
}

emit ExpenseSetTotalNeeded(_totalNeeded);
expense.totalNeeded = _totalNeeded;
}

function setPercents(uint _partsPerMillion) public onlyOwner {
function setMinAmount(uint128 _minAmount) public onlyOwner {
require(expense.partsPerMillion == 0);
require(_minAmount <= expense.totalNeeded);
require(_minAmount == uint128(_minAmount));
if(_minAmount != 0) {
require((expense.totalNeeded % _minAmount) == 0);
}

emit ExpenseSetMinAmount(_minAmount);
expense.minAmount = _minAmount;
}

function setPercents(uint32 _partsPerMillion) public onlyOwner {
require(expense.totalNeeded == 0);
require(_partsPerMillion <= 1e7);
emit ExpenseSetPercents(_partsPerMillion);
expense.partsPerMillion = uint32(_partsPerMillion);
expense.partsPerMillion = _partsPerMillion;
}

function() public {}
Expand Down
4 changes: 4 additions & 0 deletions contracts/bases/SplitterBase.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ import "../interfaces/IReceiver.sol";
*/
contract SplitterBase is SplitterLib, IReceiver, ISplitter, Ownable {
Splitter splitter;

constructor() public {
splitter = _constructSplitter(false);
}

// --------------------- UNIVERSAL INTERFACE ---------------------
function getMinNeeded(uint _currentFlow) public view returns(uint) {
Expand Down
12 changes: 4 additions & 8 deletions contracts/bases/TableBase.sol
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,6 @@ contract TableBase is ExpenseLib, SplitterLib, Ownable {
return isNeedsAt(0);
}

function getPartsPerMillion() public view returns(uint) {
return getPartsPerMillionAt(0);
}

function _processAmountAt(uint _eId, uint _currentFlow, uint _value) internal {
if(isExpenseAt(_eId)) {
expenses[_eId] = _processAmount(expenses[_eId], _currentFlow, _value);
Expand All @@ -66,13 +62,13 @@ contract TableBase is ExpenseLib, SplitterLib, Ownable {
expenses[_eId].balance = 0;
}

function getLastNodeId() public returns(uint) {
function getLastNodeId() public view returns(uint) {
if(nodesCount == 0) {
return 0;
} else {
return nodesCount - 1;
}
}
}

function getPartsPerMillionAt(uint _eId) public view isCorrectId(_eId) returns(uint ppm) {
ppm = expenses[_eId].partsPerMillion;
Expand Down Expand Up @@ -107,9 +103,9 @@ contract TableBase is ExpenseLib, SplitterLib, Ownable {
}

// -------------------- public SCHEME FUNCTIONS --------------------
function addAbsoluteExpense(uint128 _totalNeeded, uint128 _minWeiAmount, bool _isPeriodic, bool _isSlidingAmount, uint32 _periodHours) public onlyOwner {
function addAbsoluteExpense(uint128 _totalNeeded, uint128 _minAmount, bool _isPeriodic, bool _isSlidingAmount, uint32 _periodHours) public onlyOwner {
emit NodeAdded(nodesCount, IReceiver.Type.Absolute);
expenses[nodesCount] = _constructExpense(_totalNeeded, _minWeiAmount, 0, _periodHours, _isSlidingAmount, _isPeriodic);
expenses[nodesCount] = _constructExpense(_totalNeeded, _minAmount, 0, _periodHours, _isSlidingAmount, _isPeriodic);
nodesType[nodesCount] = IReceiver.Type.Absolute;
nodesCount += 1;
}
Expand Down
4 changes: 2 additions & 2 deletions contracts/ether/WeiAbsoluteExpense.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import "./WeiExpense.sol";


contract WeiAbsoluteExpense is WeiExpense {
constructor(uint _minWeiAmount, uint _totalWeiNeed) public
WeiExpense(_minWeiAmount, _totalWeiNeed, 0, 0, false, false)
constructor(uint128 _minAmount, uint128 _totalWeiNeed) public
WeiExpense(_minAmount, _totalWeiNeed, 0, 0, false, false)
{}
}
4 changes: 2 additions & 2 deletions contracts/ether/WeiAbsoluteExpenseWithPeriod.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import "./WeiExpense.sol";


contract WeiAbsoluteExpenseWithPeriod is WeiExpense {
constructor(uint _minWeiAmount, uint _totalWeiNeed, uint _periodHours) public
WeiExpense(_minWeiAmount, _totalWeiNeed, 0, _periodHours, false, true)
constructor(uint128 _minAmount, uint128 _totalWeiNeed, uint32 _periodHours) public
WeiExpense(_minAmount, _totalWeiNeed, 0, _periodHours, false, true)
{}
}
4 changes: 2 additions & 2 deletions contracts/ether/WeiAbsoluteExpenseWithPeriodSliding.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import "./WeiExpense.sol";


contract WeiAbsoluteExpenseWithPeriodSliding is WeiExpense {
constructor(uint _minWeiAmount, uint _totalWeiNeed, uint _periodHours) public
WeiExpense(_minWeiAmount, _totalWeiNeed, 0, _periodHours, true, true)
constructor(uint128 _minAmount, uint128 _totalWeiNeed, uint32 _periodHours) public
WeiExpense(_minAmount, _totalWeiNeed, 0, _periodHours, true, true)
{}
}
5 changes: 2 additions & 3 deletions contracts/ether/WeiExpense.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@ import "zeppelin-solidity/contracts/ownership/Ownable.sol";
* Should be used in the Moneyflow so will automatically receive Wei.
*/
contract WeiExpense is IWeiReceiver, IDestination, ExpenseBase {
constructor(uint _totalNeeded, uint _minWeiAmount, uint _partsPerMillion, uint _periodHours, bool _isSlidingAmount, bool _isPeriodic) public {
expense = _constructExpense(uint128(_totalNeeded), uint128(_minWeiAmount), uint32(_partsPerMillion), uint32(_periodHours), _isSlidingAmount, _isPeriodic);
}
constructor(uint128 _totalNeeded, uint128 _minAmount, uint32 _partsPerMillion, uint32 _periodHours, bool _isSlidingAmount, bool _isPeriodic)
ExpenseBase(_totalNeeded, _minAmount, _partsPerMillion, _periodHours, _isSlidingAmount, _isPeriodic) public {}

function processFunds(uint _currentFlow) public payable {
expense = _processAmount(expense, _currentFlow, msg.value);
Expand Down
2 changes: 1 addition & 1 deletion contracts/ether/WeiRelativeExpense.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import "./WeiExpense.sol";


contract WeiRelativeExpense is WeiExpense {
constructor(uint _partsPerMillion) public
constructor(uint32 _partsPerMillion) public
WeiExpense(0, 0, _partsPerMillion, 0, false, false)
{}
}
2 changes: 1 addition & 1 deletion contracts/ether/WeiRelativeExpenseWithPeriod.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import "./WeiExpense.sol";


contract WeiRelativeExpenseWithPeriod is WeiExpense {
constructor(uint _partsPerMillion, uint _periodHours) public
constructor(uint32 _partsPerMillion, uint32 _periodHours) public
WeiExpense(0, 0, _partsPerMillion, _periodHours, false, true)
{}
}
2 changes: 1 addition & 1 deletion contracts/ether/WeiRelativeExpenseWithPeriodSliding.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import "./WeiExpense.sol";


contract WeiRelativeExpenseWithPeriodSliding is WeiExpense {
constructor(uint _partsPerMillion, uint _periodHours) public
constructor(uint32 _partsPerMillion, uint32 _periodHours) public
WeiExpense(0, 0, _partsPerMillion, _periodHours, true, true)
{}
}
4 changes: 1 addition & 3 deletions contracts/ether/WeiSplitter.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@ import "../interfaces/IReceiver.sol";
* if they have ended.
*/
contract WeiSplitter is IWeiReceiver, SplitterBase {
constructor() public {
splitter = _constructSplitter(false);
}
constructor() SplitterBase() public {}

function _elementProcessing(address _target, uint _flow, uint _need) internal {
IWeiReceiver(_target).processFunds.value(_need)(_flow);
Expand Down
4 changes: 2 additions & 2 deletions contracts/examples/DefaultMoneyflowScheme.sol
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ contract DefaultMoneyflowScheme {

constructor(
address _fundOutput,
uint _percentsReserve,
uint _dividendsReserve)
uint32 _percentsReserve,
uint32 _dividendsReserve)
{
require(0x0 != _fundOutput);

Expand Down
4 changes: 2 additions & 2 deletions contracts/examples/DefaultMoneyflowSchemeWithUnpackers.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import "./DefaultMoneyflowScheme.sol";
contract DefaultMoneyflowSchemeWithUnpackers is DefaultMoneyflowScheme {
constructor(
address _fundOutput,
uint _percentsReserve,
uint _dividendsReserve) public
uint32 _percentsReserve,
uint32 _dividendsReserve) public
DefaultMoneyflowScheme(_fundOutput,_percentsReserve,_dividendsReserve)
{
}
Expand Down
2 changes: 1 addition & 1 deletion contracts/examples/moneyflow/Roadmap.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import "../../ether/WeiSplitter.sol";

contract Roadmap {

constructor(uint _sum1, uint _sum2, uint _sum3) {
constructor(uint128 _sum1, uint128 _sum2, uint128 _sum3) {
WeiSplitter roadmap = new WeiSplitter();

WeiAbsoluteExpense milestone1 = new WeiAbsoluteExpense(0, _sum1);
Expand Down
5 changes: 4 additions & 1 deletion contracts/libs/ExpenseLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ pragma solidity ^0.4.24;
*/
contract ExpenseLib {
event ExpenseFlush(address _owner, uint _balance);
event ExpenseSetNeeded(uint _totalNeeded);
event ExpenseSetTotalNeeded(uint _totalNeeded);
event ExpenseSetMinAmount(uint _minAmount);
event ExpenseSetPercents(uint _partsPerMillion);
event ExpenseProcessFunds(address _sender, uint _value, uint _currentFlow);

Expand Down Expand Up @@ -54,6 +55,8 @@ contract ExpenseLib {
require(!((_totalNeeded == 0) && (_minAmount != 0)));
require(!((_partsPerMillion != 0) && (_minAmount != 0)));
require(!((_partsPerMillion != 0) && (_totalNeeded != 0)));
require(!((_partsPerMillion == 0) && (_totalNeeded == 0)));
require(_partsPerMillion <= 1e7);
require(_minAmount <= _totalNeeded);
if(_minAmount != 0) {
require((_totalNeeded % _minAmount) == 0);
Expand Down
8 changes: 2 additions & 6 deletions contracts/libs/SplitterLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -208,11 +208,7 @@ contract SplitterLib {
}
}

function _tableProcessing(address _target, uint _eId, uint _flow, uint _need) internal {
revert();
}
function _tableProcessing(address _target, uint _eId, uint _flow, uint _need) internal {}

function _elementProcessing(address _target, uint _flow, uint _need) internal {
revert();
}
function _elementProcessing(address _target, uint _flow, uint _need) internal {}
}
4 changes: 2 additions & 2 deletions contracts/tokens/ERC20AbsoluteExpense.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import "./ERC20Expense.sol";


contract ERC20AbsoluteExpense is ERC20Expense {
constructor(address _tokenAddress, uint _minERC20Amount, uint _totalERC20Need) public
ERC20Expense(_tokenAddress, _minERC20Amount, _totalERC20Need, 0, 0, false, false)
constructor(address _tokenAddress, uint128 _minAmount, uint128 _totalNeeded) public
ERC20Expense(_tokenAddress, _minAmount, _totalNeeded, 0, 0, false, false)
{}
}
4 changes: 2 additions & 2 deletions contracts/tokens/ERC20AbsoluteExpenseWithPeriod.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import "./ERC20Expense.sol";


contract ERC20AbsoluteExpenseWithPeriod is ERC20Expense {
constructor(address _tokenAddress, uint _minERC20Amount, uint _totalERC20Need, uint _periodHours) public
ERC20Expense(_tokenAddress, _minERC20Amount, _totalERC20Need, 0, _periodHours, false, true)
constructor(address _tokenAddress, uint128 _minAmount, uint128 _totalNeeded, uint32 _periodHours) public
ERC20Expense(_tokenAddress, _minAmount, _totalNeeded, 0, _periodHours, false, true)
{}
}
4 changes: 2 additions & 2 deletions contracts/tokens/ERC20AbsoluteExpenseWithPeriodSliding.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import "./ERC20Expense.sol";


contract ERC20AbsoluteExpenseWithPeriodSliding is ERC20Expense {
constructor(address _tokenAddress, uint _minERC20Amount, uint _totalERC20Need, uint _periodHours) public
ERC20Expense(_tokenAddress, _minERC20Amount, _totalERC20Need, 0, _periodHours, true, true)
constructor(address _tokenAddress, uint128 _minAmount, uint128 _totalNeeded, uint32 _periodHours) public
ERC20Expense(_tokenAddress, _minAmount, _totalNeeded, 0, _periodHours, true, true)
{}
}
11 changes: 2 additions & 9 deletions contracts/tokens/ERC20Expense.sol
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,10 @@ import "zeppelin-solidity/contracts/token/ERC20/ERC20.sol";
contract ERC20Expense is ITokenReceiver, IDestination, ExpenseBase {
ERC20 public token;

constructor(
address _tokenAddress,
uint _totalNeeded,
uint _minAmount,
uint _partsPerMillion,
uint _periodHours,
bool _isSlidingAmount,
bool _isPeriodic) public
constructor(address _tokenAddress, uint128 _totalNeeded, uint128 _minAmount, uint32 _partsPerMillion, uint32 _periodHours, bool _isSlidingAmount, bool _isPeriodic)
ExpenseBase(_totalNeeded, _minAmount, _partsPerMillion, _periodHours, _isSlidingAmount, _isPeriodic) public
{
token = ERC20(_tokenAddress);
expense = _constructExpense(uint128(_totalNeeded), uint128(_minAmount), uint32(_partsPerMillion), uint32(_periodHours), _isSlidingAmount, _isPeriodic);
}

event ProcessTokensExpense(address sender, address target, uint _value);
Expand Down
2 changes: 1 addition & 1 deletion contracts/tokens/ERC20RelativeExpense.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import "./ERC20Expense.sol";


contract ERC20RelativeExpense is ERC20Expense {
constructor(address _tokenAddress, uint _partsPerMillion) public
constructor(address _tokenAddress, uint32 _partsPerMillion) public
ERC20Expense(_tokenAddress, 0, 0, _partsPerMillion, 0, false, false)
{}
}
2 changes: 1 addition & 1 deletion contracts/tokens/ERC20RelativeExpenseWithPeriod.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import "./ERC20Expense.sol";


contract ERC20RelativeExpenseWithPeriod is ERC20Expense {
constructor(address _tokenAddress, uint _partsPerMillion, uint _periodHours) public
constructor(address _tokenAddress, uint32 _partsPerMillion, uint32 _periodHours) public
ERC20Expense(_tokenAddress, 0, 0, _partsPerMillion, _periodHours, false, true)
{}
}
2 changes: 1 addition & 1 deletion contracts/tokens/ERC20RelativeExpenseWithPeriodSliding.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import "./ERC20Expense.sol";


contract ERC20RelativeExpenseWithPeriodSliding is ERC20Expense {
constructor(address _tokenAddress, uint _partsPerMillion, uint _periodHours) public
constructor(address _tokenAddress, uint32 _partsPerMillion, uint32 _periodHours) public
ERC20Expense(_tokenAddress, 0, 0, _partsPerMillion, _periodHours, true, true)
{}
}
3 changes: 1 addition & 2 deletions contracts/tokens/ERC20Splitter.sol
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,8 @@ import "../interfaces/IReceiver.sol";
contract ERC20Splitter is ITokenReceiver, SplitterBase {
ERC20 public token;

constructor(address _tokenAddress) public {
constructor(address _tokenAddress) SplitterBase() public {
token = ERC20(_tokenAddress);
splitter = _constructSplitter(false);
}

function _elementProcessing(address _target, uint _currentFlow, uint _value) internal {
Expand Down
8 changes: 4 additions & 4 deletions test/ERC20_tests/ERC20_table.tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,10 +105,10 @@ contract('ERC20Table tests', (accounts) => {
var b2 = await token.balanceOf(accounts[9]);
assert.equal(b2.sub(b1).toNumber(), 2 * multiplier);

var b1 = await token.balanceOf(accounts[9]);
await table.flushToAt(AbsoluteExpense3Id, accounts[9], { gasPrice: 0 });
var b2 = await token.balanceOf(accounts[9]);
assert.equal(b2.sub(b1).toNumber(), 3 * multiplier);
var b1 = await token.balanceOf(accounts[0]);
await table.flushAt(AbsoluteExpense3Id, { gasPrice: 0 });
var b2 = await token.balanceOf(accounts[0]);
assert.equal(b2.sub(b1).toNumber(), 1 * multiplier);

var absoluteExpense1Balance = await table.balanceAt(AbsoluteExpense1Id);
assert.equal(absoluteExpense1Balance.toNumber(), 0 * multiplier, 'resource point received from splitter');
Expand Down
Loading

0 comments on commit c3454f6

Please sign in to comment.