diff options
Diffstat (limited to 'internal/ethapi')
-rw-r--r-- | internal/ethapi/api.go | 39 | ||||
-rw-r--r-- | internal/ethapi/backend.go | 1 |
2 files changed, 40 insertions, 0 deletions
diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 8c950d5cf..3dec0b114 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -1288,6 +1288,31 @@ func submitTransaction(ctx context.Context, b Backend, tx *types.Transaction) (c return tx.Hash(), nil } +// submitTransactions is a helper function that submits batch of tx to txPool and logs a message. +func submitTransactions(ctx context.Context, b Backend, txs []*types.Transaction) ([]common.Hash, error) { + errs := b.SendTxs(ctx, txs) + var hashes []common.Hash + for i, err := range errs { + if err != nil { + return nil, err + } + tx := txs[i] + if tx.To() == nil { + signer := types.MakeSigner(b.ChainConfig(), b.CurrentBlock().Number()) + from, err := types.Sender(signer, tx) + if err != nil { + return nil, err + } + addr := crypto.CreateAddress(from, tx.Nonce()) + log.Info("Submitted contract creation", "fullhash", tx.Hash().Hex(), "contract", addr.Hex()) + } else { + log.Info("Submitted transaction", "fullhash", tx.Hash().Hex(), "recipient", tx.To()) + } + hashes = append(hashes, tx.Hash()) + } + return hashes, nil +} + // SendTransaction creates a transaction for the given argument, sign it and submit it to the // transaction pool. func (s *PublicTransactionPoolAPI) SendTransaction(ctx context.Context, args SendTxArgs) (common.Hash, error) { @@ -1335,6 +1360,20 @@ func (s *PublicTransactionPoolAPI) SendRawTransaction(ctx context.Context, encod return submitTransaction(ctx, s.b, tx) } +// SendRawTransactions will add the signed transaction to the transaction pool. +// The sender is responsible for signing the transaction and using the correct nonce. +func (s *PublicTransactionPoolAPI) SendRawTransactions(ctx context.Context, encodedTxs []hexutil.Bytes) ([]common.Hash, error) { + var txs []*types.Transaction + for _, encodedTx := range encodedTxs { + tx := new(types.Transaction) + if err := rlp.DecodeBytes(encodedTx, tx); err != nil { + return nil, err + } + txs = append(txs, tx) + } + return submitTransactions(ctx, s.b, txs) +} + // Sign calculates an ECDSA signature for: // keccack256("\x19Ethereum Signed Message:\n" + len(message) + message). // diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go index 801b55d5c..da13d3661 100644 --- a/internal/ethapi/backend.go +++ b/internal/ethapi/backend.go @@ -65,6 +65,7 @@ type Backend interface { // TxPool API SendTx(ctx context.Context, signedTx *types.Transaction) error + SendTxs(ctx context.Context, signedTxs []*types.Transaction) []error GetPoolTransactions() (types.Transactions, error) GetPoolTransaction(txHash common.Hash) *types.Transaction GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error) |