embarklabs / embark

Framework for serverless Decentralized Applications using Ethereum, IPFS and other platforms

Home Page:https://framework.embarklabs.io/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Support functions for contract arguments

richard-ramos opened this issue · comments

Feature Request

Some contracts require dynamic arguments that are product of contract calls, or contain abi encoded data. Proxy contracts are one of those. When a proxy contract is created, you have the option of initializing the contract immediatly, instead of having to execute a separate transaction. Let's do a quick example.

Assume you have a proxy contract with the following interface:

contract Proxy {
     constructor(address contractLogic, bytes memory initData) { ... }
}

And you have a base contract like this:

contract MyContract {
    function initialize(uint _myValue, address _someAddress) public { ... }
}

With the current options embark provides, I have to do the initialization of the proxy contract by using an afterDeploy script:

// contracts.js
{
 ...
 MyContract: {
 },
 Proxy: {
     deploy: false
 },
 MyContractProxy: {
     instanceOf: "Proxy",
     proxyFor: "MyContract",
     args: ["$MyContract", "0x"]
 },
 afterDeploy: data
}
// data.js
// ...
const myValue = 34;
const someAddress = "0x124...567";
MyContract.methods.init(myValue, someAddress).send()

Ideally, this data script wouldnt be necessary if I were able to use the second argument of the proxy's constructor to execute the initialization as soon as the contract is deployed, by allowing the args in contract.js to accept a function that can return dynamic arguments like in this proposal:

// contracts.js
{
    MyContract: {
    },
    Proxy: {
     deploy: false
    },
   MyContractProxy: {
     instanceOf: "Proxy",
     proxyFor: "MyContract",
         args: deps => {
              const initABI = deps.contracts.MyContract.options.jsonInterface.find(x => x.type === 'function' && x.name == 'initialize');
              const myValue = 34;
              const someAddress = "0x124...567";
              const abiData = deps.web3.eth.abi.encodeFunctionCall(initABI, [myValue, someAddress]);
              return [deps.contracts.MyContract.options.address, abiData];
         }
    }
}