From a1a3aab6e59b81b8a7ae4a5f53dad534d9685663 Mon Sep 17 00:00:00 2001 From: Iuri Matias Date: Sat, 20 Jun 2015 13:47:38 -0400 Subject: [PATCH] support receiving contract as argument; automatically determine correct deployment order --- tasks/deploy.coffee | 69 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 13 deletions(-) diff --git a/tasks/deploy.coffee b/tasks/deploy.coffee index d63e62663..202e19108 100644 --- a/tasks/deploy.coffee +++ b/tasks/deploy.coffee @@ -23,6 +23,19 @@ module.exports = (grunt) -> result = "web3.setProvider(new web3.providers.HttpProvider('http://#{rpcHost}:#{rpcPort}'));" result += "web3.eth.defaultAccount = web3.eth.accounts[0];" + contractDependencies = {} + if contractsConfig? + for className, options of contractsConfig + continue unless options.args? + for arg in options.args + if arg[0] is "$" + if contractDependencies[className] is undefined + contractDependencies[className] = [] + contractDependencies[className].push(arg.substr(1)) + + all_contracts = [] + contractDB = {} + contractFiles = grunt.file.expand(grunt.config.get("deploy.contracts")) for contractFile in contractFiles source = grunt.file.read(contractFile) @@ -31,26 +44,56 @@ module.exports = (grunt) -> compiled_contracts = web3.eth.compile.solidity(source) for className, contract of compiled_contracts - contractGasLimit = contractsConfig?[className]?.gasLimit || gasLimit - contractGasPrice = contractsConfig?[className]?.gasPrice || gasPrice + all_contracts.push(className) + contractDB[className] = contract - args = contractsConfig?[className]?.args + all_contracts.sort (a,b) => + contract_1 = contractDependencies[a] + contract_2 = contractDependencies[b] - contractObject = web3.eth.contract(contract.info.abiDefinition) + if a in contract_1 and b in contract_2 + grunt.log.writeln("looks like you have a circular dependency between #{a} and #{b}") + exit + else if b in contract_1 + 1 + else if a in contract_2 + -1 + else + 0 - contractParams = args || [] - contractParams.push({from: primaryAddress, data: contract.code, gas: contractGasLimit, gasPrice: contractGasPrice}) - contractAddress = contractObject.new.apply(contractObject, contractParams).address + deployedContracts = {} - console.log "address is #{contractAddress}" + for className in all_contracts + contract = contractDB[className] + contractGasLimit = contractsConfig?[className]?.gasLimit || gasLimit + contractGasPrice = contractsConfig?[className]?.gasPrice || gasPrice - grunt.log.writeln("deployed #{className} at #{contractAddress}") + args = contractsConfig?[className]?.args || [] - abi = JSON.stringify(contract.info.abiDefinition) + contractObject = web3.eth.contract(contract.info.abiDefinition) - result += "var #{className}Abi = #{abi};" - result += "var #{className}Contract = web3.eth.contract(#{className}Abi);" - result += "var #{className} = #{className}Contract.at('#{contractAddress}');"; + realArgs = [] + + for arg in args + if arg[0] is "$" + realArgs.push(deployedContracts[arg.substr(1)]) + else + realArgs.push(arg) + + contractParams = realArgs + contractParams.push({from: primaryAddress, data: contract.code, gas: contractGasLimit, gasPrice: contractGasPrice}) + contractAddress = contractObject.new.apply(contractObject, contractParams).address + deployedContracts[className] = contractAddress + + console.log "address is #{contractAddress}" + + grunt.log.writeln("deployed #{className} at #{contractAddress}") + + abi = JSON.stringify(contract.info.abiDefinition) + + result += "var #{className}Abi = #{abi};" + result += "var #{className}Contract = web3.eth.contract(#{className}Abi);" + result += "var #{className} = #{className}Contract.at('#{contractAddress}');"; destFile = grunt.config.get("deploy.dest") grunt.file.write(destFile, result)