From ec7a6784c1cac06126110dd1fcfe9ddeb2b3f0be Mon Sep 17 00:00:00 2001 From: decanus Date: Fri, 27 Apr 2018 01:07:24 +0200 Subject: [PATCH 1/4] dynamic vault experiment --- .../Vault/Connectors/ConnectorInterface.sol | 10 ++++ contracts/Vault/VaultV2.sol | 50 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 contracts/Vault/Connectors/ConnectorInterface.sol create mode 100644 contracts/Vault/VaultV2.sol diff --git a/contracts/Vault/Connectors/ConnectorInterface.sol b/contracts/Vault/Connectors/ConnectorInterface.sol new file mode 100644 index 0000000..d5dc3c3 --- /dev/null +++ b/contracts/Vault/Connectors/ConnectorInterface.sol @@ -0,0 +1,10 @@ +pragma solidity ^0.4.23; + +interface ConnectorInterface { + + function deposit(address token, address user, uint amount) external; + function withdraw(address token, address user, uint amount) external; + function balanceOf(address token, address user) external returns (uint); + function receiver() external returns (bytes4); + +} diff --git a/contracts/Vault/VaultV2.sol b/contracts/Vault/VaultV2.sol new file mode 100644 index 0000000..3b835b3 --- /dev/null +++ b/contracts/Vault/VaultV2.sol @@ -0,0 +1,50 @@ +pragma solidity ^0.4.23; + +import "./Connectors/ConnectorInterface.sol"; + +contract VaultV2 { + + event Deposited(address token, address user, uint amount); + event Withdrawn(address token, address user, uint amount); + + mapping (bytes4 => ConnectorInterface) public receivers; + mapping (address => ConnectorInterface) public connectors; + + function () payable { + // @todo move deposit into here potentially + + ConnectorInterface connector = receivers[msg.sig]; + require(address(connector) != 0x0); + + assembly { + calldatacopy(0x0, 0x0, calldatasize) + + result := delegatecall(sub(gas, 10000), connector, 0x0, calldatasize, 0, 0) + size := returndatasize + + returndatacopy(0, 0, size) + + switch result case 0 { revert(0, size) } + default { return(0, size) } + } + } + + function deposit(address token, address user, uint amount) external payable { + ConnectorInterface connector = connectors[token]; + connectors[token].delegatecall.value(msg.value)( + connector.deposit.selector, + user, + amount + ); + + emit Deposited(token, user, amount); + } + + function withdraw(address token, address user, uint amount) external { + ConnectorInterface connector = connectors[token]; + require(connector.balanceOf(token, user) >= amount); + connector.delegatecall(connector.withdraw.selector, token, user, amount); + + emit Withdrawn(token, user, amount); + } +} From cf4474ea062d1b2efa17142ee831fa2fa8f1721e Mon Sep 17 00:00:00 2001 From: decanus Date: Fri, 27 Apr 2018 01:11:09 +0200 Subject: [PATCH 2/4] minor --- contracts/Vault/VaultV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/Vault/VaultV2.sol b/contracts/Vault/VaultV2.sol index 3b835b3..9e70399 100644 --- a/contracts/Vault/VaultV2.sol +++ b/contracts/Vault/VaultV2.sol @@ -10,7 +10,7 @@ contract VaultV2 { mapping (bytes4 => ConnectorInterface) public receivers; mapping (address => ConnectorInterface) public connectors; - function () payable { + function () public payable { // @todo move deposit into here potentially ConnectorInterface connector = receivers[msg.sig]; From 0d385f41b9c1f939ad16227ec6cd994b72ca870b Mon Sep 17 00:00:00 2001 From: decanus Date: Fri, 27 Apr 2018 01:15:26 +0200 Subject: [PATCH 3/4] updated --- contracts/Vault/Connectors/ConnectorInterface.sol | 1 + contracts/Vault/VaultV2.sol | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/contracts/Vault/Connectors/ConnectorInterface.sol b/contracts/Vault/Connectors/ConnectorInterface.sol index d5dc3c3..a78f795 100644 --- a/contracts/Vault/Connectors/ConnectorInterface.sol +++ b/contracts/Vault/Connectors/ConnectorInterface.sol @@ -2,6 +2,7 @@ pragma solidity ^0.4.23; interface ConnectorInterface { + function register() external; function deposit(address token, address user, uint amount) external; function withdraw(address token, address user, uint amount) external; function balanceOf(address token, address user) external returns (uint); diff --git a/contracts/Vault/VaultV2.sol b/contracts/Vault/VaultV2.sol index 9e70399..2bb8160 100644 --- a/contracts/Vault/VaultV2.sol +++ b/contracts/Vault/VaultV2.sol @@ -29,6 +29,15 @@ contract VaultV2 { } } + function addConnector(ConnectorInterface connector) external { + connector.delegatecall(connector.register.selector); + + bytes4 receiver = connector.receiver(); + if (receiver != 0x0) { + receivers[receiver] = connector; + } + } + function deposit(address token, address user, uint amount) external payable { ConnectorInterface connector = connectors[token]; connectors[token].delegatecall.value(msg.value)( From c437990c48b383f7c1672d9081c7beb1ca56fb7e Mon Sep 17 00:00:00 2001 From: Dean Eigenmann Date: Fri, 27 Apr 2018 01:27:30 +0200 Subject: [PATCH 4/4] Update VaultV2.sol --- contracts/Vault/VaultV2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/Vault/VaultV2.sol b/contracts/Vault/VaultV2.sol index 2bb8160..e3bb377 100644 --- a/contracts/Vault/VaultV2.sol +++ b/contracts/Vault/VaultV2.sol @@ -42,6 +42,7 @@ contract VaultV2 { ConnectorInterface connector = connectors[token]; connectors[token].delegatecall.value(msg.value)( connector.deposit.selector, + token, user, amount );