Fix Deploy Libraries

pull/3094/head
yann300 7 years ago
parent 8cbc8dfc70
commit e6519af9f9
  1. 62
      src/deployer.js

@ -1,6 +1,5 @@
var async = require('async')
// TODO: replace this with remix's own deployer code
var remixLib = require('remix-lib')
function deployAll (compileResult, web3, callback) {
let compiledObject = {}
@ -30,6 +29,7 @@ function deployAll (compileResult, web3, callback) {
compiledObject[className].code = code
compiledObject[className].filename = filename
compiledObject[className].className = className
compiledObject[className].raw = contract
if (contractFile.indexOf('_test.sol') >= 0) {
compiledObject[className].isTest = true
@ -53,35 +53,7 @@ function deployAll (compileResult, web3, callback) {
next(null, contractsToDeploy)
},
function deployContracts (contractsToDeploy, next) {
async.eachOfLimit(contractsToDeploy, 1, function (contractName, index, nextEach) {
let contract = compiledObject[contractName]
if (!contract) {
console.error('Contract not found: ' + contractName)
return nextEach(new Error('Contract not found: ' + contractName))
}
let contractObject = new web3.eth.Contract(contract.abi)
let contractCode = '0x' + contract.code
// TODO: temporary code, and terrible if the contracts are not in order...
for (let name in compiledObject) {
let contractObj = compiledObject[name]
let linkReference = '__' + contractObj.filename + ':' + contractObj.className
let toReplace = linkReference + '_'.repeat(40 - linkReference.length)
if (contractCode.indexOf(linkReference) < 0) {
continue
}
if (!contractObj.deployedAddress) {
throw new Error('linking not found for ' + name + ' when deploying ' + contractName)
}
contractCode = contractCode.replace(new RegExp(toReplace, 'g'), contractObj.deployedAddress.slice(2))
}
let deployObject = contractObject.deploy({arguments: [], data: contractCode})
var deployRunner = (deployObject, contractObject, contractName, callback) => {
deployObject.estimateGas().then((gasValue) => {
deployObject.send({
from: accounts[0],
@ -94,12 +66,36 @@ function deployAll (compileResult, web3, callback) {
contracts[contractName] = contractObject
nextEach()
callback(null, { result: { createdAddress: receipt.contractAddress } }) // TODO this will only work with JavaScriptV VM
}).on('error', function (err) {
console.dir(err)
nextEach(err)
callback(err)
})
})
}
async.eachOfLimit(contractsToDeploy, 1, function (contractName, index, nextEach) {
let contract = compiledObject[contractName]
let encodeDataFinalCallback = (error, contractDeployData) => {
if (error) return nextEach(error)
let contractObject = new web3.eth.Contract(contract.abi)
let deployObject = contractObject.deploy({arguments: [], data: '0x' + contractDeployData.dataHex})
deployRunner(deployObject, contractObject, contractName, (error) => { nextEach(error) })
}
let encodeDataStepCallback = (msg) => { console.dir(msg) }
let encodeDataDeployLibraryCallback = (libData, callback) => {
let abi = compiledObject[libData.data.contractName].abi
let code = compiledObject[libData.data.contractName].code
let libraryObject = new web3.eth.Contract(abi)
let deployObject = libraryObject.deploy({arguments: [], data: '0x' + code})
deployRunner(deployObject, libraryObject, libData.data.contractName, callback)
}
let funAbi = null // no need to set the abi for encoding the constructor
let params = '' // we suppose that the test contract does not have any param in the constructor
remixLib.execution.txFormat.encodeConstructorCallAndDeployLibraries(contractName, contract.raw, compileResult, params, funAbi, encodeDataFinalCallback, encodeDataStepCallback, encodeDataDeployLibraryCallback)
}, function () {
next(null, contracts)
})

Loading…
Cancel
Save