cmd/geth: implemented resending transaction with different gas settings

This commit is contained in:
obscuren 2015-05-05 23:09:46 +02:00
parent 92f998c7ef
commit 7fed424435
1 changed files with 83 additions and 0 deletions

View File

@ -3,6 +3,7 @@ package main
import (
"errors"
"fmt"
"strconv"
"time"
"github.com/ethereum/go-ethereum/cmd/utils"
@ -22,6 +23,11 @@ node admin bindings
*/
func (js *jsre) adminBindings() {
ethO, _ := js.re.Get("eth")
eth := ethO.Object()
eth.Set("transactions", js.transactions)
eth.Set("resend", js.resend)
js.re.Set("admin", struct{}{})
t, _ := js.re.Get("admin")
admin := t.Object()
@ -74,6 +80,83 @@ func (js *jsre) getBlock(call otto.FunctionCall) (*types.Block, error) {
return nil, errors.New("requires block number or block hash as argument")
}
type tx struct {
tx *types.Transaction
To string
From string
Nonce string
Value string
Data string
GasLimit string
GasPrice string
}
func newTx(t *types.Transaction) *tx {
from, _ := t.From()
var to string
if t := t.To(); t != nil {
to = t.Hex()
}
return &tx{
tx: t,
To: to,
From: from.Hex(),
Value: t.Amount.String(),
Nonce: strconv.Itoa(int(t.Nonce())),
Data: "0x" + common.Bytes2Hex(t.Data()),
GasLimit: t.GasLimit.String(),
GasPrice: t.GasPrice().String(),
}
}
func (js *jsre) transactions(call otto.FunctionCall) otto.Value {
txs := js.ethereum.TxPool().GetTransactions()
ltxs := make([]*tx, len(txs))
for i, tx := range txs {
ltxs[i] = newTx(tx)
}
return js.re.ToVal(ltxs)
}
func (js *jsre) resend(call otto.FunctionCall) otto.Value {
if len(call.ArgumentList) == 0 {
fmt.Println("first argument must be a transaction")
return otto.FalseValue()
}
v, err := call.Argument(0).Export()
if err != nil {
fmt.Println(err)
return otto.FalseValue()
}
if tx, ok := v.(*tx); ok {
gl, gp := tx.GasLimit, tx.GasPrice
if len(call.ArgumentList) > 1 {
gl = call.Argument(1).String()
}
if len(call.ArgumentList) > 2 {
gp = call.Argument(2).String()
}
ret, err := js.xeth.Transact(tx.From, tx.To, tx.Nonce, tx.Value, gl, gp, tx.Data)
if err != nil {
fmt.Println(err)
return otto.FalseValue()
}
js.ethereum.TxPool().RemoveTransactions(types.Transactions{tx.tx})
return js.re.ToVal(ret)
}
fmt.Println("first argument must be a transaction")
return otto.FalseValue()
}
func (js *jsre) debugBlock(call otto.FunctionCall) otto.Value {
block, err := js.getBlock(call)
if err != nil {