@@ -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
@@ -69,39 +70,53 @@ module.exports = function (opts, cb) {
6970 code = txData
7071 txData = undefined
7172 var newNonce = new BN ( account . nonce ) . subn ( 1 )
72-
73+
7374 if ( salt ) {
7475 createdAddress = toAddress = ethUtil . generateAddress2 ( caller , salt , code )
7576 } else {
7677 createdAddress = toAddress = ethUtil . generateAddress ( caller , newNonce . toArray ( ) )
7778 }
7879
79- stateManager . clearContractStorage ( createdAddress , function ( err ) {
80+ stateManager . getAccount ( createdAddress , function ( err , account ) {
8081 if ( err ) {
8182 done ( err )
83+ return
8284 }
8385
84- async . series ( [
85- newContractEvent ,
86- getAccount
87- ] , done )
88-
89- function newContractEvent ( callback ) {
90- self . emit ( 'newContract' , {
91- address : createdAddress ,
92- code : code
93- } , callback )
86+ if ( ( account . nonce && new BN ( account . nonce ) > 0 ) || account . codeHash . compare ( EMPTY_CODE_HASH ) != 0 ) {
87+ done ( ERROR . INVALID_OPCODE )
88+ return
9489 }
9590
96- function getAccount ( callback ) {
97- stateManager . getAccount ( createdAddress , function ( err , account ) {
98- toAccount = account
99- const NONCE_OFFSET = 1
100- toAccount . nonce = new BN ( toAccount . nonce ) . addn ( NONCE_OFFSET ) . toArrayLike ( Buffer )
101- callback ( err )
102- } )
103- }
91+ stateManager . clearContractStorage ( createdAddress , function ( err ) {
92+ if ( err ) {
93+ done ( err )
94+ return
95+ }
96+
97+ async . series ( [
98+ newContractEvent ,
99+ getAccount
100+ ] , done )
101+
102+ function newContractEvent ( callback ) {
103+ self . emit ( 'newContract' , {
104+ address : createdAddress ,
105+ code : code
106+ } , callback )
107+ }
108+
109+ function getAccount ( callback ) {
110+ stateManager . getAccount ( createdAddress , function ( err , account ) {
111+ toAccount = account
112+ const NONCE_OFFSET = 1
113+ toAccount . nonce = new BN ( toAccount . nonce ) . addn ( NONCE_OFFSET ) . toArrayLike ( Buffer )
114+ callback ( err )
115+ } )
116+ }
117+ } )
104118 } )
119+
105120 } else {
106121 // else load the `to` account
107122 toAccount = stateManager . cache . get ( toAddress )
0 commit comments