Skip to content

Added upgradable contraintLimits #798

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 31 commits into from
Oct 16, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
2a87697
simplify contract
Oct 7, 2020
685675e
tests
Oct 7, 2020
6b91201
test approval
Oct 7, 2020
feae9ee
check spender is white listed
Oct 7, 2020
1a6cd03
clean
Oct 7, 2020
e06fe11
poc
Oct 8, 2020
8872446
Add SchemeConstraints interface
Oct 8, 2020
9c9b4ab
add eth constraint as an example for DxDaoSchemeConstraint
Oct 8, 2020
e7cb197
+
Oct 8, 2020
519f7cb
more ..
Oct 11, 2020
221721f
fix dxdao constraints
Oct 11, 2020
8917c30
check schemeConstraint exist
Oct 11, 2020
aad9d93
+ comments
Oct 12, 2020
912657e
Merge branch 'master' into schemeconstraint
orenyodfat Oct 13, 2020
8a0bd6b
coverage
Oct 13, 2020
09c040e
Added upgradable contraintLimits
nicoelzer Oct 13, 2020
0231a5f
updated genericschmemulticall tests
nicoelzer Oct 13, 2020
d6809a2
Updated DXdaoSchemeConstraints
nicoelzer Oct 15, 2020
ad54756
Added contraint events and smaller updates
nicoelzer Oct 15, 2020
990ca26
Added additional tests for DxDaoSchemeConstraints
nicoelzer Oct 15, 2020
bd5a72b
rebase from arc/master
nicoelzer Oct 15, 2020
aad8929
Updated DxDaoSchemeContraints events & general cleanup
nicoelzer Oct 15, 2020
1b319f6
solhint cleanup
nicoelzer Oct 15, 2020
20469c7
Merge branch 'master' into schemeConstraintUpgradable
nicoelzer Oct 15, 2020
32c8403
cleanup
nicoelzer Oct 15, 2020
9aa64d2
Merge branch 'schemeConstraintUpgradable' of https://github.com/nicoe…
nicoelzer Oct 15, 2020
58b64b8
Fixed test issues
nicoelzer Oct 15, 2020
75a38d1
updated DxDaoSchemeConstraints.sol
nicoelzer Oct 15, 2020
d1d85ce
only genericSchemeMultiCall can call isAllowToCall
Oct 15, 2020
924f713
comments
Oct 15, 2020
3f6c82a
Added additional test for GenericSchemeMultiCall
nicoelzer Oct 16, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 84 additions & 15 deletions contracts/schemes/DxDaoSchemeConstraints.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,25 @@ pragma experimental ABIEncoderV2;

import "./SchemeConstraints.sol";


contract DxDaoSchemeConstraints is SchemeConstraints {
using SafeMath for uint256;

event UpdatedContractsWhitelist(
address[] _contractsAddresses,
bool[] _contractsWhitelisted
);

event UpdatedPeriodLimitsTokens(
address[] _tokensAddresses,
uint256[] _tokensPeriodLimits
);

event UpdatedPeriodLimitWei(
uint256 _periodLimitWei
);

address public avatar;
address public genericSchemeMultiCall;
uint256 public initialTimestamp;
uint256 public periodSize;
uint256 public periodLimitWei;
Expand All @@ -18,26 +33,32 @@ contract DxDaoSchemeConstraints is SchemeConstraints {
bytes4 private constant APPROVE_SIGNATURE = 0x095ea7b3;//approve(address,uint256)

/* @dev initialize
* @param avatar the DAOs avatar address
* @param _periodSize the time period to limit the tokens and eth spending
* @param _periodLimitWei the limit of eth which can be sent per period
* @param _periodLimitTokensAddresses tokens to limit
* @param _periodLimitTokensAmounts the limit of token which can be sent per period
* @param _contractsWhiteList the contracts the scheme is allowed to interact with
* @param _genericSchemeMultiCall genericSchemeMultiCall which allowed to call isAllowedToCall
*/
function initialize(
address _avatar,
uint256 _periodSize,
uint256 _periodLimitWei,
address[] calldata _periodLimitTokensAddresses,
uint256[] calldata _periodLimitTokensAmounts,
address[] calldata _contractsWhiteList
address[] calldata _contractsWhiteList,
address _genericSchemeMultiCall
)
external {
require(initialTimestamp == 0, "cannot initialize twice");
require(_periodSize > 0, "preriod size should be greater than 0");
require(_periodLimitTokensAddresses.length == _periodLimitTokensAmounts.length,
"invalid length _periodLimitTokensAddresses");
require(_genericSchemeMultiCall != address(0), "genericSchemeMultiCall cannot be zero");
periodSize = _periodSize;
periodLimitWei = _periodLimitWei;
avatar = _avatar;
// solhint-disable-next-line not-rely-on-time
initialTimestamp = block.timestamp;
for (uint i = 0; i < _contractsWhiteList.length; i++) {
Expand All @@ -47,6 +68,55 @@ contract DxDaoSchemeConstraints is SchemeConstraints {
periodLimitToken[_periodLimitTokensAddresses[i]] = _periodLimitTokensAmounts[i];
}
contractsWhiteList = _contractsWhiteList;
genericSchemeMultiCall = _genericSchemeMultiCall;
}

/*
* @dev updateContractWhitelist used to let the DAO update whitelisted contracts.
* @param _contractsAddresses - The contract that should be update
* @param _contractsWhitelisted – true adds a contract to the whitelist, false removes it.
*/
function updateContractsWhitelist(
address[] calldata _contractsAddresses,
bool[] calldata _contractsWhitelisted
)
external {
require(msg.sender == avatar, "caller must be avatar");
require(_contractsAddresses.length == _contractsWhitelisted.length,
"invalid length _periodLimitTokensAddresses");
for (uint i = 0; i < _contractsAddresses.length; i++) {
contractsWhiteListMap[_contractsAddresses[i]] = _contractsWhitelisted[i];
}
emit UpdatedContractsWhitelist(_contractsAddresses, _contractsWhitelisted);
}

/*
* @dev updatePeriodLimitsTokens lets the dao update limits to token limits.
* @param _tokensAddresses - The token addresses to be updated
* @param _tokensPeriodLimits – The token amounts to be set as period limit.
*/
function updatePeriodLimitsTokens(
address[] calldata _tokensAddresses,
uint256[] calldata _tokensPeriodLimits
)
external {
require(msg.sender == avatar, "caller must be avatar");
require(_tokensAddresses.length == _tokensPeriodLimits.length,
"invalid length _tokensPeriodLimits");
for (uint i = 0; i < _tokensAddresses.length; i++) {
periodLimitToken[_tokensAddresses[i]] = _tokensPeriodLimits[i];
}
emit UpdatedPeriodLimitsTokens(_tokensAddresses, _tokensPeriodLimits);
}

/*
* @dev updatePeriodLimitWei lets the dao update limits to ETH spending limit.
* @param _periodLimitWei - The new spending limit in WEI that should be set.
*/
function updatePeriodLimitWei(uint256 _periodLimitWei) external {
require(msg.sender == avatar, "caller must be avatar");
periodLimitWei = _periodLimitWei;
emit UpdatedPeriodLimitWei(_periodLimitWei);
}

/*
Expand All @@ -68,10 +138,11 @@ contract DxDaoSchemeConstraints is SchemeConstraints {
external
returns(bool)
{

require(msg.sender == genericSchemeMultiCall, "only genericSchemeMultiCall");
uint256 observervationIndex = observationIndex();
uint256 totalPeriodSpendingInWei;
for (uint i = 0; i < _contractsToCall.length; i++) {
require(contractsWhiteListMap[_contractsToCall[i]], "contract not whitelisted");
// constraint eth transfer
totalPeriodSpendingInWei = totalPeriodSpendingInWei.add(_values[i]);
bytes memory callData = _callsData[i];
Expand All @@ -81,11 +152,14 @@ contract DxDaoSchemeConstraints is SchemeConstraints {
callData[2] == APPROVE_SIGNATURE[2] &&
callData[3] == APPROVE_SIGNATURE[3]) {
uint256 amount;
address spender;
address contractToCall = _contractsToCall[i];
// solhint-disable-next-line no-inline-assembly
assembly {
amount := mload(add(callData, 68))
spender := mload(add(callData, 36))
amount := mload(add(callData, 68))
}
require(contractsWhiteListMap[spender], "spender contract not whitelisted");
periodSpendingToken[observervationIndex][contractToCall] =
periodSpendingToken[observervationIndex][contractToCall].add(amount);
require(
Expand Down Expand Up @@ -118,18 +192,13 @@ contract DxDaoSchemeConstraints is SchemeConstraints {
returns(bool)
{
for (uint i = 0; i < _contractsToCall.length; i++) {
if (!contractsWhiteListMap[_contractsToCall[i]]) {
require(contractsWhiteListMap[_contractsToCall[i]], "contract not whitelisted");
bytes memory callData = _callsData[i];
if (callData[0] == APPROVE_SIGNATURE[0] &&
callData[1] == APPROVE_SIGNATURE[1] &&
callData[2] == APPROVE_SIGNATURE[2] &&
callData[3] == APPROVE_SIGNATURE[3]) {
address spender;
bytes memory callData = _callsData[i];
require(
callData[0] == APPROVE_SIGNATURE[0] &&
callData[1] == APPROVE_SIGNATURE[1] &&
callData[2] == APPROVE_SIGNATURE[2] &&
callData[3] == APPROVE_SIGNATURE[3],
"allow only approve call for none whitelistedContracts");
//in solidity > 6 this can be replaced by:
//(spender,) = abi.descode(callData[4:], (address, uint));
// see https://github.com/ethereum/solidity/issues/9439
// solhint-disable-next-line no-inline-assembly
assembly {
spender := mload(add(callData, 36))
Expand Down
Loading