Skip to content

Commit bca112e

Browse files
authored
GeneriSchemeMultiCalls : remove byteslib.sol (#793)
* remove byteslib * more tests
1 parent cb4ac6f commit bca112e

File tree

3 files changed

+31
-133
lines changed

3 files changed

+31
-133
lines changed

contracts/libs/BytesLib.sol

Lines changed: 0 additions & 82 deletions
This file was deleted.

contracts/schemes/GenericSchemeMultiCall.sol

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
pragma solidity 0.5.17;
2+
pragma experimental ABIEncoderV2;
23

34
import "@daostack/infra/contracts/votingMachines/IntVoteInterface.sol";
45
import "@daostack/infra/contracts/votingMachines/ProposalExecuteInterface.sol";
56
import "../votingMachines/VotingMachineCallbacks.sol";
6-
import "../libs/BytesLib.sol";
77

88

99
/**
@@ -12,14 +12,12 @@ import "../libs/BytesLib.sol";
1212
* on one or multiple contracts on behalf of the organization avatar.
1313
*/
1414
contract GenericSchemeMultiCall is VotingMachineCallbacks, ProposalExecuteInterface {
15-
using BytesLib for bytes;
1615
using SafeMath for uint256;
1716

1817
// Details of a voting proposal:
1918
struct MultiCallProposal {
2019
address[] contractsToCall;
21-
bytes callsData;
22-
uint256[] callsDataLens;
20+
bytes[] callsData;
2321
uint256[] values;
2422
bool exist;
2523
bool passed;
@@ -36,7 +34,7 @@ contract GenericSchemeMultiCall is VotingMachineCallbacks, ProposalExecuteInterf
3634
event NewMultiCallProposal(
3735
address indexed _avatar,
3836
bytes32 indexed _proposalId,
39-
bytes _callsData,
37+
bytes[] _callsData,
4038
uint256[] _values,
4139
string _descriptionHash,
4240
address[] _contractsToCall
@@ -51,7 +49,7 @@ contract GenericSchemeMultiCall is VotingMachineCallbacks, ProposalExecuteInterf
5149
address indexed _avatar,
5250
bytes32 indexed _proposalId,
5351
address _contractToCall,
54-
bytes _callsData,
52+
bytes _callData,
5553
bytes _callDataReturnValue
5654
);
5755

@@ -133,10 +131,9 @@ contract GenericSchemeMultiCall is VotingMachineCallbacks, ProposalExecuteInterf
133131
bytes memory genericCallReturnValue;
134132
bool success;
135133
Controller controller = Controller(whitelistedContracts[0]);
136-
uint256 startIndex = 0;
137134

138135
for (uint i = 0; i < proposal.contractsToCall.length; i++) {
139-
bytes memory callData = proposal.callsData.slice(startIndex, proposal.callsDataLens[i]);
136+
bytes memory callData = proposal.callsData[i];
140137
if (proposal.contractsToCall[i] == address(controller)) {
141138
(IERC20 extToken,
142139
address spender,
@@ -154,7 +151,6 @@ contract GenericSchemeMultiCall is VotingMachineCallbacks, ProposalExecuteInterf
154151

155152
/* Whole transaction will be reverted if at least one call fails*/
156153
require(success, "Proposal call failed");
157-
startIndex = startIndex.add(proposal.callsDataLens[i]);
158154
emit ProposalCallExecuted(
159155
address(avatar),
160156
_proposalId,
@@ -174,50 +170,46 @@ contract GenericSchemeMultiCall is VotingMachineCallbacks, ProposalExecuteInterf
174170
* The function trigger NewMultiCallProposal event
175171
* @param _contractsToCall the contracts to be called
176172
* @param _callsData - The abi encode data for the calls
177-
* @param _callsDataLens the length of each callData
178173
* @param _values value(ETH) to transfer with the calls
179174
* @param _descriptionHash proposal description hash
180175
* @return an id which represents the proposal
176+
* Note: The reasone this function is public(and not 'external') is due to
177+
* known compiler issue handling calldata bytes[] still not solved in 0.5.17
178+
* see : https://github.com/ethereum/solidity/issues/6835#issuecomment-549895381
181179
*/
182180
function proposeCalls(
183181
address[] memory _contractsToCall,
184-
bytes memory _callsData,
185-
uint256[] memory _callsDataLens,
182+
bytes[] memory _callsData,
186183
uint256[] memory _values,
187184
string memory _descriptionHash
188185
)
189186
public
190187
returns(bytes32 proposalId)
191188
{
192189
require(
193-
(_contractsToCall.length == _callsDataLens.length) && (_contractsToCall.length == _values.length),
190+
(_contractsToCall.length == _callsData.length) && (_contractsToCall.length == _values.length),
194191
"Wrong length of _contractsToCall, _callsDataLens or _values arrays"
195192
);
196-
uint256 startIndex = 0;
197193
for (uint i = 0; i < _contractsToCall.length; i++) {
198194
require(
199195
contractWhitelist[_contractsToCall[i]], "contractToCall is not whitelisted"
200196
);
201-
bytes memory callData = _callsData.slice(startIndex, _callsDataLens[i]);
202197
if (_contractsToCall[i] == whitelistedContracts[0]) {
203198

204199
(, address spender,) =
205200
abi.decode(
206-
callData,
201+
_callsData[i],
207202
(IERC20, address, uint256)
208203
);
209204
require(contractWhitelist[spender], "spender contract not whitelisted");
210205
}
211-
startIndex = startIndex.add(_callsDataLens[i]);
212206
}
213-
require(startIndex == _callsData.length, "_callsDataLens is wrong");
214207

215208
proposalId = votingMachine.propose(2, voteParams, msg.sender, address(avatar));
216209

217210
proposals[proposalId] = MultiCallProposal({
218211
contractsToCall: _contractsToCall,
219212
callsData: _callsData,
220-
callsDataLens: _callsDataLens,
221213
values: _values,
222214
exist: true,
223215
passed: false

0 commit comments

Comments
 (0)