@@ -5,6 +5,7 @@ const BN = ethUtil.BN
55const exceptions = require ( './exceptions.js' )
66
77const ERROR = exceptions . ERROR
8+ const EMPTY_CODE_HASH = ethUtil . keccak256 ( )
89
910/**
1011 * runs a CALL operation
@@ -70,39 +71,53 @@ module.exports = function (opts, cb) {
7071 code = txData
7172 txData = undefined
7273 var newNonce = new BN ( account . nonce ) . subn ( 1 )
73-
74+
7475 if ( salt ) {
7576 createdAddress = toAddress = ethUtil . generateAddress2 ( caller , salt , code )
7677 } else {
7778 createdAddress = toAddress = ethUtil . generateAddress ( caller , newNonce . toArray ( ) )
7879 }
7980
80- stateManager . clearContractStorage ( createdAddress , function ( err ) {
81+ stateManager . getAccount ( createdAddress , function ( err , account ) {
8182 if ( err ) {
8283 done ( err )
84+ return
8385 }
8486
85- async . series ( [
86- newContractEvent ,
87- getAccount
88- ] , done )
89-
90- function newContractEvent ( callback ) {
91- self . emit ( 'newContract' , {
92- address : createdAddress ,
93- code : code
94- } , callback )
87+ if ( ( account . nonce && new BN ( account . nonce ) > 0 ) || account . codeHash . compare ( EMPTY_CODE_HASH ) != 0 ) {
88+ done ( ERROR . INVALID_OPCODE )
89+ return
9590 }
9691
97- function getAccount ( callback ) {
98- stateManager . getAccount ( createdAddress , function ( err , account ) {
99- toAccount = account
100- const NONCE_OFFSET = 1
101- toAccount . nonce = new BN ( toAccount . nonce ) . addn ( NONCE_OFFSET ) . toArrayLike ( Buffer )
102- callback ( err )
103- } )
104- }
92+ stateManager . clearContractStorage ( createdAddress , function ( err ) {
93+ if ( err ) {
94+ done ( err )
95+ return
96+ }
97+
98+ async . series ( [
99+ newContractEvent ,
100+ getAccount
101+ ] , done )
102+
103+ function newContractEvent ( callback ) {
104+ self . emit ( 'newContract' , {
105+ address : createdAddress ,
106+ code : code
107+ } , callback )
108+ }
109+
110+ function getAccount ( callback ) {
111+ stateManager . getAccount ( createdAddress , function ( err , account ) {
112+ toAccount = account
113+ const NONCE_OFFSET = 1
114+ toAccount . nonce = new BN ( toAccount . nonce ) . addn ( NONCE_OFFSET ) . toArrayLike ( Buffer )
115+ callback ( err )
116+ } )
117+ }
118+ } )
105119 } )
120+
106121 } else {
107122 // else load the `to` account
108123 toAccount = stateManager . cache . get ( toAddress )
0 commit comments