Commit 0d776328 authored by obscuren's avatar obscuren

Refund gas

parent 8b15732c
...@@ -163,6 +163,15 @@ func (self *StateObject) BuyGas(gas, price *big.Int) error { ...@@ -163,6 +163,15 @@ func (self *StateObject) BuyGas(gas, price *big.Int) error {
return nil return nil
} }
func (self *StateObject) RefundGas(gas, price *big.Int) {
self.gasPool.Add(self.gasPool, gas)
rGas := new(big.Int).Set(gas)
rGas.Mul(rGas, price)
self.Amount.Sub(self.Amount, rGas)
}
func (self *StateObject) Copy() *StateObject { func (self *StateObject) Copy() *StateObject {
stCopy := &StateObject{} stCopy := &StateObject{}
stCopy.address = make([]byte, len(self.address)) stCopy.address = make([]byte, len(self.address))
......
...@@ -110,6 +110,15 @@ func (self *StateTransition) BuyGas() error { ...@@ -110,6 +110,15 @@ func (self *StateTransition) BuyGas() error {
return nil return nil
} }
func (self *StateTransition) RefundGas() {
coinbase, sender := self.Coinbase(), self.Sender()
coinbase.RefundGas(self.gas, self.tx.GasPrice)
// Return remaining gas
remaining := new(big.Int).Mul(self.gas, self.tx.GasPrice)
sender.AddAmount(remaining)
}
func (self *StateTransition) TransitionState() (err error) { func (self *StateTransition) TransitionState() (err error) {
//snapshot := st.state.Snapshot() //snapshot := st.state.Snapshot()
...@@ -141,6 +150,8 @@ func (self *StateTransition) TransitionState() (err error) { ...@@ -141,6 +150,8 @@ func (self *StateTransition) TransitionState() (err error) {
// XXX Transactions after this point are considered valid. // XXX Transactions after this point are considered valid.
defer func() { defer func() {
self.RefundGas()
if sender != nil { if sender != nil {
self.state.UpdateStateObject(sender) self.state.UpdateStateObject(sender)
} }
...@@ -148,6 +159,8 @@ func (self *StateTransition) TransitionState() (err error) { ...@@ -148,6 +159,8 @@ func (self *StateTransition) TransitionState() (err error) {
if receiver != nil { if receiver != nil {
self.state.UpdateStateObject(receiver) self.state.UpdateStateObject(receiver)
} }
self.state.UpdateStateObject(self.Coinbase())
}() }()
// Increment the nonce for the next transaction // Increment the nonce for the next transaction
...@@ -203,10 +216,6 @@ func (self *StateTransition) TransitionState() (err error) { ...@@ -203,10 +216,6 @@ func (self *StateTransition) TransitionState() (err error) {
} }
} }
// Return remaining gas
remaining := new(big.Int).Mul(self.gas, tx.GasPrice)
sender.AddAmount(remaining)
return nil return nil
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment