@@ -112,7 +112,7 @@ func (self *StateTransition) BuyGas() error {
112
112
113
113
sender := self .From ()
114
114
if sender .Balance ().Cmp (MessageGasValue (self .msg )) < 0 {
115
- return fmt .Errorf ("Insufficient funds to pre-pay gas. Req %v, has %v" , MessageGasValue (self .msg ), sender .Balance ())
115
+ return fmt .Errorf ("insufficient ETH for gas (%x) . Req %v, has %v" , sender . Address ()[: 4 ] , MessageGasValue (self .msg ), sender .Balance ())
116
116
}
117
117
118
118
coinbase := self .Coinbase ()
@@ -186,15 +186,22 @@ func (self *StateTransition) TransitionState() (ret []byte, err error) {
186
186
vmenv := self .VmEnv ()
187
187
var ref vm.ClosureRef
188
188
if MessageCreatesContract (msg ) {
189
- self .rec = MakeContract (msg , self .state )
190
-
191
- ret , err , ref = vmenv .Create (sender , self .rec .Address (), self .msg .Data (), self .gas , self .gasPrice , self .value )
192
- ref .SetCode (ret )
189
+ contract := MakeContract (msg , self .state )
190
+ ret , err , ref = vmenv .Create (sender , contract .Address (), self .msg .Data (), self .gas , self .gasPrice , self .value )
191
+ if err == nil {
192
+ dataGas := big .NewInt (int64 (len (ret )))
193
+ dataGas .Mul (dataGas , vm .GasCreateByte )
194
+ if err = self .UseGas (dataGas ); err == nil {
195
+ //self.state.SetCode(ref.Address(), ret)
196
+ ref .SetCode (ret )
197
+ }
198
+ }
193
199
} else {
194
200
ret , err = vmenv .Call (self .From (), self .To ().Address (), self .msg .Data (), self .gas , self .gasPrice , self .value )
195
201
}
202
+
196
203
if err != nil {
197
- statelogger . Debugln ( err )
204
+ self . UseGas ( self . gas )
198
205
}
199
206
200
207
return
@@ -211,20 +218,19 @@ func MakeContract(msg Message, state *state.StateDB) *state.StateObject {
211
218
}
212
219
213
220
func (self * StateTransition ) RefundGas () {
214
- coinbaseSub := new (big.Int ).Set (self .gas )
221
+ coinbase , sender := self .Coinbase (), self .From ()
222
+ // Return remaining gas
223
+ remaining := new (big.Int ).Mul (self .gas , self .msg .GasPrice ())
224
+ sender .AddAmount (remaining )
225
+
215
226
uhalf := new (big.Int ).Div (self .GasUsed (), ethutil .Big2 )
216
227
for addr , ref := range self .state .Refunds () {
217
228
refund := ethutil .BigMin (uhalf , ref )
218
- coinbaseSub .Add (self .gas , refund )
229
+ self . gas .Add (self .gas , refund )
219
230
self .state .AddBalance ([]byte (addr ), refund .Mul (refund , self .msg .GasPrice ()))
220
231
}
221
232
222
- coinbase , sender := self .Coinbase (), self .From ()
223
- coinbase .RefundGas (coinbaseSub , self .msg .GasPrice ())
224
-
225
- // Return remaining gas
226
- remaining := new (big.Int ).Mul (self .gas , self .msg .GasPrice ())
227
- sender .AddAmount (remaining )
233
+ coinbase .RefundGas (self .gas , self .msg .GasPrice ())
228
234
}
229
235
230
236
func (self * StateTransition ) GasUsed () * big.Int {
0 commit comments