Better logic for contract deployments (#4821)

This commit is contained in:
Nicolas Gotchac 2017-03-08 13:21:39 +01:00 committed by Jaco Greeff
parent 94a39619b5
commit 02c51c83cd
1 changed files with 38 additions and 2 deletions

View File

@ -148,7 +148,19 @@ export default class MethodDecodingStore {
// Contract deployment
if (!signature || signature === CONTRACT_CREATE || transaction.creates) {
return this.decodeContractCreation(result, contractAddress || transaction.creates);
const address = contractAddress || transaction.creates;
return this.isContractCreation(input, address)
.then((isContractCreation) => {
if (!isContractCreation) {
result.contract = false;
result.deploy = false;
return result;
}
return this.decodeContractCreation(result, address);
});
}
return this
@ -204,7 +216,7 @@ export default class MethodDecodingStore {
const { input } = data;
const abi = this._contractsAbi[contractAddress];
if (!input || !abi || !abi.constructors || abi.constructors.length === 0) {
if (!abi || !abi.constructors || abi.constructors.length === 0) {
return Promise.resolve(result);
}
@ -306,6 +318,30 @@ export default class MethodDecodingStore {
return Promise.resolve(this._isContract[contractAddress]);
}
/**
* Check if the input resulted in a contract creation
* by checking that the contract address code contains
* a part of the input, or vice-versa
*/
isContractCreation (input, contractAddress) {
return this.api.eth
.getCode(contractAddress)
.then((code) => {
if (/^(0x)?0*$/.test(code)) {
return false;
}
const strippedCode = code.replace(/^0x/, '');
const strippedInput = input.replace(/^0x/, '');
return strippedInput.indexOf(strippedInput) >= 0 || strippedCode.indexOf(strippedInput) >= 0;
})
.catch((error) => {
console.error(error);
return false;
});
}
getCode (contractAddress) {
// If zero address, resolve to '0x'
if (!contractAddress || /^(0x)?0*$/.test(contractAddress)) {