api.go 73.4 KB
Newer Older
1
// Copyright 2015 The go-ethereum Authors
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.

package ethapi

import (
20
	"context"
21
	"encoding/hex"
22
	"errors"
23 24 25 26 27
	"fmt"
	"math/big"
	"strings"
	"time"

28
	"github.com/davecgh/go-spew/spew"
29
	"github.com/ethereum/go-ethereum/accounts"
30
	"github.com/ethereum/go-ethereum/accounts/abi"
31
	"github.com/ethereum/go-ethereum/accounts/keystore"
32
	"github.com/ethereum/go-ethereum/accounts/scwallet"
33
	"github.com/ethereum/go-ethereum/common"
34
	"github.com/ethereum/go-ethereum/common/hexutil"
35
	"github.com/ethereum/go-ethereum/common/math"
36
	"github.com/ethereum/go-ethereum/consensus/ethash"
37
	"github.com/ethereum/go-ethereum/consensus/misc"
38
	"github.com/ethereum/go-ethereum/core"
39
	"github.com/ethereum/go-ethereum/core/state"
40 41 42
	"github.com/ethereum/go-ethereum/core/types"
	"github.com/ethereum/go-ethereum/core/vm"
	"github.com/ethereum/go-ethereum/crypto"
43
	"github.com/ethereum/go-ethereum/eth/tracers/logger"
44
	"github.com/ethereum/go-ethereum/log"
45
	"github.com/ethereum/go-ethereum/p2p"
46
	"github.com/ethereum/go-ethereum/params"
47 48
	"github.com/ethereum/go-ethereum/rlp"
	"github.com/ethereum/go-ethereum/rpc"
49
	"github.com/tyler-smith/go-bip39"
50 51
)

52 53
// EthereumAPI provides an API to access Ethereum related information.
type EthereumAPI struct {
54
	b Backend
55 56
}

57 58 59
// NewEthereumAPI creates a new Ethereum protocol API.
func NewEthereumAPI(b Backend) *EthereumAPI {
	return &EthereumAPI{b}
60 61
}

62
// GasPrice returns a suggestion for a gas price for legacy transactions.
63
func (s *EthereumAPI) GasPrice(ctx context.Context) (*hexutil.Big, error) {
64 65 66 67 68 69 70 71 72 73
	tipcap, err := s.b.SuggestGasTipCap(ctx)
	if err != nil {
		return nil, err
	}
	if head := s.b.CurrentHeader(); head.BaseFee != nil {
		tipcap.Add(tipcap, head.BaseFee)
	}
	return (*hexutil.Big)(tipcap), err
}

74
// MaxPriorityFeePerGas returns a suggestion for a gas tip cap for dynamic fee transactions.
75
func (s *EthereumAPI) MaxPriorityFeePerGas(ctx context.Context) (*hexutil.Big, error) {
76 77 78 79 80
	tipcap, err := s.b.SuggestGasTipCap(ctx)
	if err != nil {
		return nil, err
	}
	return (*hexutil.Big)(tipcap), err
81 82
}

83
type feeHistoryResult struct {
84
	OldestBlock  *hexutil.Big     `json:"oldestBlock"`
85 86 87
	Reward       [][]*hexutil.Big `json:"reward,omitempty"`
	BaseFee      []*hexutil.Big   `json:"baseFeePerGas,omitempty"`
	GasUsedRatio []float64        `json:"gasUsedRatio"`
88 89
}

90
// FeeHistory returns the fee market history.
91
func (s *EthereumAPI) FeeHistory(ctx context.Context, blockCount rpc.DecimalOrHex, lastBlock rpc.BlockNumber, rewardPercentiles []float64) (*feeHistoryResult, error) {
92
	oldest, reward, baseFee, gasUsed, err := s.b.FeeHistory(ctx, int(blockCount), lastBlock, rewardPercentiles)
93
	if err != nil {
94
		return nil, err
95
	}
96
	results := &feeHistoryResult{
97
		OldestBlock:  (*hexutil.Big)(oldest),
98
		GasUsedRatio: gasUsed,
99 100 101
	}
	if reward != nil {
		results.Reward = make([][]*hexutil.Big, len(reward))
102 103 104 105
		for i, w := range reward {
			results.Reward[i] = make([]*hexutil.Big, len(w))
			for j, v := range w {
				results.Reward[i][j] = (*hexutil.Big)(v)
106 107 108 109 110 111 112 113 114 115 116 117
			}
		}
	}
	if baseFee != nil {
		results.BaseFee = make([]*hexutil.Big, len(baseFee))
		for i, v := range baseFee {
			results.BaseFee[i] = (*hexutil.Big)(v)
		}
	}
	return results, nil
}

118 119 120 121 122 123 124
// Syncing returns false in case the node is currently not syncing with the network. It can be up to date or has not
// yet received the latest block headers from its pears. In case it is synchronizing:
// - startingBlock: block number this node started to synchronise from
// - currentBlock:  block number this node is currently importing
// - highestBlock:  block number of the highest block header this node has received from peers
// - pulledStates:  number of state entries processed until now
// - knownStates:   number of known state entries that still need to be pulled
125
func (s *EthereumAPI) Syncing() (interface{}, error) {
126
	progress := s.b.SyncProgress()
127 128

	// Return not syncing if the synchronisation already completed
129
	if progress.CurrentBlock >= progress.HighestBlock {
130 131 132 133
		return false, nil
	}
	// Otherwise gather the block sync stats
	return map[string]interface{}{
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
		"startingBlock":       hexutil.Uint64(progress.StartingBlock),
		"currentBlock":        hexutil.Uint64(progress.CurrentBlock),
		"highestBlock":        hexutil.Uint64(progress.HighestBlock),
		"syncedAccounts":      hexutil.Uint64(progress.SyncedAccounts),
		"syncedAccountBytes":  hexutil.Uint64(progress.SyncedAccountBytes),
		"syncedBytecodes":     hexutil.Uint64(progress.SyncedBytecodes),
		"syncedBytecodeBytes": hexutil.Uint64(progress.SyncedBytecodeBytes),
		"syncedStorage":       hexutil.Uint64(progress.SyncedStorage),
		"syncedStorageBytes":  hexutil.Uint64(progress.SyncedStorageBytes),
		"healedTrienodes":     hexutil.Uint64(progress.HealedTrienodes),
		"healedTrienodeBytes": hexutil.Uint64(progress.HealedTrienodeBytes),
		"healedBytecodes":     hexutil.Uint64(progress.HealedBytecodes),
		"healedBytecodeBytes": hexutil.Uint64(progress.HealedBytecodeBytes),
		"healingTrienodes":    hexutil.Uint64(progress.HealingTrienodes),
		"healingBytecode":     hexutil.Uint64(progress.HealingBytecode),
149 150 151
	}, nil
}

152 153
// TxPoolAPI offers and API for the transaction pool. It only operates on data that is non confidential.
type TxPoolAPI struct {
154 155 156
	b Backend
}

157 158 159
// NewTxPoolAPI creates a new tx pool service that gives information about the transaction pool.
func NewTxPoolAPI(b Backend) *TxPoolAPI {
	return &TxPoolAPI{b}
160 161 162
}

// Content returns the transactions contained within the transaction pool.
163
func (s *TxPoolAPI) Content() map[string]map[string]map[string]*RPCTransaction {
164 165 166
	content := map[string]map[string]map[string]*RPCTransaction{
		"pending": make(map[string]map[string]*RPCTransaction),
		"queued":  make(map[string]map[string]*RPCTransaction),
167 168
	}
	pending, queue := s.b.TxPoolContent()
169
	curHeader := s.b.CurrentHeader()
170
	// Flatten the pending transactions
171 172
	for account, txs := range pending {
		dump := make(map[string]*RPCTransaction)
173
		for _, tx := range txs {
174
			dump[fmt.Sprintf("%d", tx.Nonce())] = newRPCPendingTransaction(tx, curHeader, s.b.ChainConfig())
175 176 177 178
		}
		content["pending"][account.Hex()] = dump
	}
	// Flatten the queued transactions
179 180
	for account, txs := range queue {
		dump := make(map[string]*RPCTransaction)
181
		for _, tx := range txs {
182
			dump[fmt.Sprintf("%d", tx.Nonce())] = newRPCPendingTransaction(tx, curHeader, s.b.ChainConfig())
183 184 185 186 187 188
		}
		content["queued"][account.Hex()] = dump
	}
	return content
}

189
// ContentFrom returns the transactions contained within the transaction pool.
190
func (s *TxPoolAPI) ContentFrom(addr common.Address) map[string]map[string]*RPCTransaction {
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
	content := make(map[string]map[string]*RPCTransaction, 2)
	pending, queue := s.b.TxPoolContentFrom(addr)
	curHeader := s.b.CurrentHeader()

	// Build the pending transactions
	dump := make(map[string]*RPCTransaction, len(pending))
	for _, tx := range pending {
		dump[fmt.Sprintf("%d", tx.Nonce())] = newRPCPendingTransaction(tx, curHeader, s.b.ChainConfig())
	}
	content["pending"] = dump

	// Build the queued transactions
	dump = make(map[string]*RPCTransaction, len(queue))
	for _, tx := range queue {
		dump[fmt.Sprintf("%d", tx.Nonce())] = newRPCPendingTransaction(tx, curHeader, s.b.ChainConfig())
	}
	content["queued"] = dump

	return content
}

212
// Status returns the number of pending and queued transaction in the pool.
213
func (s *TxPoolAPI) Status() map[string]hexutil.Uint {
214
	pending, queue := s.b.Stats()
215 216 217
	return map[string]hexutil.Uint{
		"pending": hexutil.Uint(pending),
		"queued":  hexutil.Uint(queue),
218 219 220 221 222
	}
}

// Inspect retrieves the content of the transaction pool and flattens it into an
// easily inspectable list.
223
func (s *TxPoolAPI) Inspect() map[string]map[string]map[string]string {
224 225 226
	content := map[string]map[string]map[string]string{
		"pending": make(map[string]map[string]string),
		"queued":  make(map[string]map[string]string),
227 228 229 230 231 232
	}
	pending, queue := s.b.TxPoolContent()

	// Define a formatter to flatten a transaction into a string
	var format = func(tx *types.Transaction) string {
		if to := tx.To(); to != nil {
233
			return fmt.Sprintf("%s: %v wei + %v gas × %v wei", tx.To().Hex(), tx.Value(), tx.Gas(), tx.GasPrice())
234
		}
235
		return fmt.Sprintf("contract creation: %v wei + %v gas × %v wei", tx.Value(), tx.Gas(), tx.GasPrice())
236 237
	}
	// Flatten the pending transactions
238 239
	for account, txs := range pending {
		dump := make(map[string]string)
240 241
		for _, tx := range txs {
			dump[fmt.Sprintf("%d", tx.Nonce())] = format(tx)
242 243 244 245
		}
		content["pending"][account.Hex()] = dump
	}
	// Flatten the queued transactions
246 247
	for account, txs := range queue {
		dump := make(map[string]string)
248 249
		for _, tx := range txs {
			dump[fmt.Sprintf("%d", tx.Nonce())] = format(tx)
250 251 252 253 254 255
		}
		content["queued"][account.Hex()] = dump
	}
	return content
}

256
// EthereumAccountAPI provides an API to access accounts managed by this node.
257
// It offers only methods that can retrieve accounts.
258
type EthereumAccountAPI struct {
259 260 261
	am *accounts.Manager
}

262 263 264
// NewEthereumAccountAPI creates a new EthereumAccountAPI.
func NewEthereumAccountAPI(am *accounts.Manager) *EthereumAccountAPI {
	return &EthereumAccountAPI{am: am}
265 266
}

267 268
// Accounts returns the collection of accounts this node manages.
func (s *EthereumAccountAPI) Accounts() []common.Address {
269
	return s.am.Accounts()
270 271
}

272
// PersonalAccountAPI provides an API to access accounts managed by this node.
273 274
// It offers methods to create, (un)lock en list accounts. Some methods accept
// passwords and are therefore considered private by default.
275
type PersonalAccountAPI struct {
276 277 278
	am        *accounts.Manager
	nonceLock *AddrLocker
	b         Backend
279 280
}

281 282 283
// NewPersonalAccountAPI create a new PersonalAccountAPI.
func NewPersonalAccountAPI(b Backend, nonceLock *AddrLocker) *PersonalAccountAPI {
	return &PersonalAccountAPI{
284 285 286
		am:        b.AccountManager(),
		nonceLock: nonceLock,
		b:         b,
287 288 289
	}
}

290
// ListAccounts will return a list of addresses for accounts this node manages.
291
func (s *PersonalAccountAPI) ListAccounts() []common.Address {
292
	return s.am.Accounts()
293 294
}

295 296 297 298 299
// rawWallet is a JSON representation of an accounts.Wallet interface, with its
// data contents extracted into plain fields.
type rawWallet struct {
	URL      string             `json:"url"`
	Status   string             `json:"status"`
300 301
	Failure  string             `json:"failure,omitempty"`
	Accounts []accounts.Account `json:"accounts,omitempty"`
302 303 304
}

// ListWallets will return a list of wallets this node manages.
305
func (s *PersonalAccountAPI) ListWallets() []rawWallet {
306
	wallets := make([]rawWallet, 0) // return [] instead of nil if empty
307
	for _, wallet := range s.am.Wallets() {
308 309 310
		status, failure := wallet.Status()

		raw := rawWallet{
311
			URL:      wallet.URL().String(),
312
			Status:   status,
313
			Accounts: wallet.Accounts(),
314 315 316 317 318
		}
		if failure != nil {
			raw.Failure = failure.Error()
		}
		wallets = append(wallets, raw)
319 320 321 322
	}
	return wallets
}

323 324 325 326
// OpenWallet initiates a hardware wallet opening procedure, establishing a USB
// connection and attempting to authenticate via the provided passphrase. Note,
// the method may return an extra challenge requiring a second open (e.g. the
// Trezor PIN matrix challenge).
327
func (s *PersonalAccountAPI) OpenWallet(url string, passphrase *string) error {
328 329 330 331 332 333 334 335 336 337 338
	wallet, err := s.am.Wallet(url)
	if err != nil {
		return err
	}
	pass := ""
	if passphrase != nil {
		pass = *passphrase
	}
	return wallet.Open(pass)
}

339 340
// DeriveAccount requests a HD wallet to derive a new account, optionally pinning
// it for later reuse.
341
func (s *PersonalAccountAPI) DeriveAccount(url string, path string, pin *bool) (accounts.Account, error) {
342 343 344 345
	wallet, err := s.am.Wallet(url)
	if err != nil {
		return accounts.Account{}, err
	}
346 347 348 349
	derivPath, err := accounts.ParseDerivationPath(path)
	if err != nil {
		return accounts.Account{}, err
	}
350 351 352
	if pin == nil {
		pin = new(bool)
	}
353
	return wallet.Derive(derivPath, *pin)
354 355
}

356
// NewAccount will create a new account and returns the address for the new account.
357
func (s *PersonalAccountAPI) NewAccount(password string) (common.Address, error) {
358 359 360 361 362
	ks, err := fetchKeystore(s.am)
	if err != nil {
		return common.Address{}, err
	}
	acc, err := ks.NewAccount(password)
363
	if err == nil {
364 365 366
		log.Info("Your new key was generated", "address", acc.Address)
		log.Warn("Please backup your key file!", "path", acc.URL.Path)
		log.Warn("Please remember your password!")
367 368 369 370 371
		return acc.Address, nil
	}
	return common.Address{}, err
}

372
// fetchKeystore retrieves the encrypted keystore from the account manager.
373 374 375 376 377
func fetchKeystore(am *accounts.Manager) (*keystore.KeyStore, error) {
	if ks := am.Backends(keystore.KeyStoreType); len(ks) > 0 {
		return ks[0].(*keystore.KeyStore), nil
	}
	return nil, errors.New("local keystore not used")
378 379
}

380 381
// ImportRawKey stores the given hex encoded ECDSA key into the key directory,
// encrypting it with the passphrase.
382
func (s *PersonalAccountAPI) ImportRawKey(privkey string, password string) (common.Address, error) {
383
	key, err := crypto.HexToECDSA(privkey)
384 385 386
	if err != nil {
		return common.Address{}, err
	}
387 388 389 390 391
	ks, err := fetchKeystore(s.am)
	if err != nil {
		return common.Address{}, err
	}
	acc, err := ks.ImportECDSA(key, password)
392 393 394 395 396 397
	return acc.Address, err
}

// UnlockAccount will unlock the account associated with the given address with
// the given password for duration seconds. If duration is nil it will use a
// default of 300 seconds. It returns an indication if the account was unlocked.
398
func (s *PersonalAccountAPI) UnlockAccount(ctx context.Context, addr common.Address, password string, duration *uint64) (bool, error) {
399 400 401 402 403 404 405
	// When the API is exposed by external RPC(http, ws etc), unless the user
	// explicitly specifies to allow the insecure account unlocking, otherwise
	// it is disabled.
	if s.b.ExtRPCEnabled() && !s.b.AccountManager().Config().InsecureUnlockAllowed {
		return false, errors.New("account unlock with HTTP access is forbidden")
	}

406
	const max = uint64(time.Duration(math.MaxInt64) / time.Second)
407
	var d time.Duration
408
	if duration == nil {
409
		d = 300 * time.Second
410 411
	} else if *duration > max {
		return false, errors.New("unlock duration too large")
412 413
	} else {
		d = time.Duration(*duration) * time.Second
414
	}
415 416 417 418 419
	ks, err := fetchKeystore(s.am)
	if err != nil {
		return false, err
	}
	err = ks.TimedUnlock(accounts.Account{Address: addr}, password, d)
420 421 422
	if err != nil {
		log.Warn("Failed account unlock attempt", "address", addr, "err", err)
	}
423
	return err == nil, err
424 425 426
}

// LockAccount will lock the account associated with the given address when it's unlocked.
427
func (s *PersonalAccountAPI) LockAccount(addr common.Address) bool {
428 429 430 431
	if ks, err := fetchKeystore(s.am); err == nil {
		return ks.Lock(addr) == nil
	}
	return false
432 433
}

434
// signTransaction sets defaults and signs the given transaction
435 436
// NOTE: the caller needs to ensure that the nonceLock is held, if applicable,
// and release it after the transaction has been submitted to the tx pool
437
func (s *PersonalAccountAPI) signTransaction(ctx context.Context, args *TransactionArgs, passwd string) (*types.Transaction, error) {
438
	// Look up the wallet containing the requested signer
439
	account := accounts.Account{Address: args.from()}
440 441
	wallet, err := s.am.Find(account)
	if err != nil {
442
		return nil, err
443 444 445
	}
	// Set some sanity defaults and terminate on failure
	if err := args.setDefaults(ctx, s.b); err != nil {
446
		return nil, err
447
	}
448
	// Assemble the transaction and sign with the wallet
449
	tx := args.toTransaction()
450

451
	return wallet.SignTxWithPassphrase(account, passwd, tx, s.b.ChainConfig().ChainID)
452 453 454
}

// SendTransaction will create a transaction from the given arguments and
455 456
// tries to sign it with the key associated with args.From. If the given
// passwd isn't able to decrypt the key it fails.
457
func (s *PersonalAccountAPI) SendTransaction(ctx context.Context, args TransactionArgs, passwd string) (common.Hash, error) {
458
	if args.Nonce == nil {
459
		// Hold the mutex around signing to prevent concurrent assignment of
460
		// the same nonce to multiple accounts.
461 462
		s.nonceLock.LockAddr(args.from())
		defer s.nonceLock.UnlockAddr(args.from())
463
	}
464
	signed, err := s.signTransaction(ctx, &args, passwd)
465
	if err != nil {
466
		log.Warn("Failed transaction send attempt", "from", args.from(), "to", args.To, "value", args.Value.ToInt(), "err", err)
467 468
		return common.Hash{}, err
	}
469
	return SubmitTransaction(ctx, s.b, signed)
470 471
}

472
// SignTransaction will create a transaction from the given arguments and
473
// tries to sign it with the key associated with args.From. If the given passwd isn't
474 475
// able to decrypt the key it fails. The transaction is returned in RLP-form, not broadcast
// to other nodes
476
func (s *PersonalAccountAPI) SignTransaction(ctx context.Context, args TransactionArgs, passwd string) (*SignTransactionResult, error) {
477 478
	// No need to obtain the noncelock mutex, since we won't be sending this
	// tx into the transaction pool, but right back to the user
479 480 481
	if args.From == nil {
		return nil, fmt.Errorf("sender not specified")
	}
482 483 484
	if args.Gas == nil {
		return nil, fmt.Errorf("gas not specified")
	}
485 486
	if args.GasPrice == nil && (args.MaxFeePerGas == nil || args.MaxPriorityFeePerGas == nil) {
		return nil, fmt.Errorf("missing gasPrice or maxFeePerGas/maxPriorityFeePerGas")
487 488 489 490
	}
	if args.Nonce == nil {
		return nil, fmt.Errorf("nonce not specified")
	}
491
	// Before actually signing the transaction, ensure the transaction fee is reasonable.
492 493
	tx := args.toTransaction()
	if err := checkTxFee(tx.GasPrice(), tx.Gas(), s.b.RPCTxFeeCap()); err != nil {
494 495
		return nil, err
	}
496
	signed, err := s.signTransaction(ctx, &args, passwd)
497
	if err != nil {
498
		log.Warn("Failed transaction sign attempt", "from", args.from(), "to", args.To, "value", args.Value.ToInt(), "err", err)
499 500
		return nil, err
	}
501
	data, err := signed.MarshalBinary()
502 503 504 505 506 507
	if err != nil {
		return nil, err
	}
	return &SignTransactionResult{data, signed}, nil
}

508
// Sign calculates an Ethereum ECDSA signature for:
509
// keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))
510
//
511 512 513
// Note, the produced signature conforms to the secp256k1 curve R, S and V values,
// where the V value will be 27 or 28 for legacy reasons.
//
514 515 516
// The key used to calculate the signature is decrypted with the given password.
//
// https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_sign
517
func (s *PersonalAccountAPI) Sign(ctx context.Context, data hexutil.Bytes, addr common.Address, passwd string) (hexutil.Bytes, error) {
518 519 520 521 522 523 524 525
	// Look up the wallet containing the requested signer
	account := accounts.Account{Address: addr}

	wallet, err := s.b.AccountManager().Find(account)
	if err != nil {
		return nil, err
	}
	// Assemble sign the data with the wallet
526
	signature, err := wallet.SignTextWithPassphrase(account, passwd, data)
527
	if err != nil {
528
		log.Warn("Failed data sign attempt", "address", addr, "err", err)
529 530
		return nil, err
	}
531
	signature[crypto.RecoveryIDOffset] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper
532
	return signature, nil
533 534 535 536 537 538 539 540
}

// EcRecover returns the address for the account that was used to create the signature.
// Note, this function is compatible with eth_sign and personal_sign. As such it recovers
// the address of:
// hash = keccak256("\x19Ethereum Signed Message:\n"${message length}${message})
// addr = ecrecover(hash, signature)
//
541
// Note, the signature must conform to the secp256k1 curve R, S and V values, where
542
// the V value must be 27 or 28 for legacy reasons.
543
//
544
// https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_ecRecover
545
func (s *PersonalAccountAPI) EcRecover(ctx context.Context, data, sig hexutil.Bytes) (common.Address, error) {
546 547
	if len(sig) != crypto.SignatureLength {
		return common.Address{}, fmt.Errorf("signature must be %d bytes long", crypto.SignatureLength)
548
	}
549
	if sig[crypto.RecoveryIDOffset] != 27 && sig[crypto.RecoveryIDOffset] != 28 {
550
		return common.Address{}, fmt.Errorf("invalid Ethereum signature (V is not 27 or 28)")
551
	}
552
	sig[crypto.RecoveryIDOffset] -= 27 // Transform yellow paper V from 27/28 to 0/1
553

554
	rpk, err := crypto.SigToPub(accounts.TextHash(data), sig)
555 556 557
	if err != nil {
		return common.Address{}, err
	}
558
	return crypto.PubkeyToAddress(*rpk), nil
559 560
}

561
// InitializeWallet initializes a new wallet at the provided URL, by generating and returning a new private key.
562
func (s *PersonalAccountAPI) InitializeWallet(ctx context.Context, url string) (string, error) {
563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583
	wallet, err := s.am.Wallet(url)
	if err != nil {
		return "", err
	}

	entropy, err := bip39.NewEntropy(256)
	if err != nil {
		return "", err
	}

	mnemonic, err := bip39.NewMnemonic(entropy)
	if err != nil {
		return "", err
	}

	seed := bip39.NewSeed(mnemonic, "")

	switch wallet := wallet.(type) {
	case *scwallet.Wallet:
		return mnemonic, wallet.Initialize(seed)
	default:
584
		return "", fmt.Errorf("specified wallet does not support initialization")
585 586 587
	}
}

588
// Unpair deletes a pairing between wallet and geth.
589
func (s *PersonalAccountAPI) Unpair(ctx context.Context, url string, pin string) error {
590 591 592 593 594 595 596 597 598
	wallet, err := s.am.Wallet(url)
	if err != nil {
		return err
	}

	switch wallet := wallet.(type) {
	case *scwallet.Wallet:
		return wallet.Unpair([]byte(pin))
	default:
599
		return fmt.Errorf("specified wallet does not support pairing")
600 601 602
	}
}

603 604
// BlockChainAPI provides an API to access Ethereum blockchain data.
type BlockChainAPI struct {
605
	b Backend
606 607
}

608 609 610
// NewBlockChainAPI creates a new Ethereum blockchain API.
func NewBlockChainAPI(b Backend) *BlockChainAPI {
	return &BlockChainAPI{b}
611 612
}

613
// ChainId is the EIP-155 replay-protection chain id for the current Ethereum chain config.
614 615 616 617 618
//
// Note, this method does not conform to EIP-695 because the configured chain ID is always
// returned, regardless of the current head block. We used to return an error when the chain
// wasn't synced up to a block where EIP-155 is enabled, but this behavior caused issues
// in CL clients.
619 620
func (api *BlockChainAPI) ChainId() *hexutil.Big {
	return (*hexutil.Big)(api.b.ChainConfig().ChainID)
621 622
}

623
// BlockNumber returns the block number of the chain head.
624
func (s *BlockChainAPI) BlockNumber() hexutil.Uint64 {
625
	header, _ := s.b.HeaderByNumber(context.Background(), rpc.LatestBlockNumber) // latest header should always be available
626
	return hexutil.Uint64(header.Number.Uint64())
627 628 629 630 631
}

// GetBalance returns the amount of wei for the given address in the state of the
// given block number. The rpc.LatestBlockNumber and rpc.PendingBlockNumber meta
// block numbers are also allowed.
632
func (s *BlockChainAPI) GetBalance(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (*hexutil.Big, error) {
633
	state, _, err := s.b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash)
634 635 636
	if state == nil || err != nil {
		return nil, err
	}
637
	return (*hexutil.Big)(state.GetBalance(address)), state.Error()
638 639
}

640 641 642 643 644 645 646 647 648 649
// Result structs for GetProof
type AccountResult struct {
	Address      common.Address  `json:"address"`
	AccountProof []string        `json:"accountProof"`
	Balance      *hexutil.Big    `json:"balance"`
	CodeHash     common.Hash     `json:"codeHash"`
	Nonce        hexutil.Uint64  `json:"nonce"`
	StorageHash  common.Hash     `json:"storageHash"`
	StorageProof []StorageResult `json:"storageProof"`
}
650

651 652 653 654 655 656 657
type StorageResult struct {
	Key   string       `json:"key"`
	Value *hexutil.Big `json:"value"`
	Proof []string     `json:"proof"`
}

// GetProof returns the Merkle-proof for a given account and optionally some storage keys.
658
func (s *BlockChainAPI) GetProof(ctx context.Context, address common.Address, storageKeys []string, blockNrOrHash rpc.BlockNumberOrHash) (*AccountResult, error) {
659
	state, _, err := s.b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash)
660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677
	if state == nil || err != nil {
		return nil, err
	}

	storageTrie := state.StorageTrie(address)
	storageHash := types.EmptyRootHash
	codeHash := state.GetCodeHash(address)
	storageProof := make([]StorageResult, len(storageKeys))

	// if we have a storageTrie, (which means the account exists), we can update the storagehash
	if storageTrie != nil {
		storageHash = storageTrie.Hash()
	} else {
		// no storageTrie means the account does not exist, so the codeHash is the hash of an empty bytearray.
		codeHash = crypto.Keccak256Hash(nil)
	}

	// create the proof for the storageKeys
678 679 680 681 682
	for i, hexKey := range storageKeys {
		key, err := decodeHash(hexKey)
		if err != nil {
			return nil, err
		}
683
		if storageTrie != nil {
684
			proof, storageError := state.GetStorageProof(address, key)
685 686 687
			if storageError != nil {
				return nil, storageError
			}
688
			storageProof[i] = StorageResult{hexKey, (*hexutil.Big)(state.GetState(address, key).Big()), toHexSlice(proof)}
689
		} else {
690
			storageProof[i] = StorageResult{hexKey, &hexutil.Big{}, []string{}}
691 692 693 694 695 696 697 698 699 700 701
		}
	}

	// create the accountProof
	accountProof, proofErr := state.GetProof(address)
	if proofErr != nil {
		return nil, proofErr
	}

	return &AccountResult{
		Address:      address,
702
		AccountProof: toHexSlice(accountProof),
703 704 705 706 707 708 709 710
		Balance:      (*hexutil.Big)(state.GetBalance(address)),
		CodeHash:     codeHash,
		Nonce:        hexutil.Uint64(state.GetNonce(address)),
		StorageHash:  storageHash,
		StorageProof: storageProof,
	}, state.Error()
}

711 712 713 714 715 716
// decodeHash parses a hex-encoded 32-byte hash. The input may optionally
// be prefixed by 0x and can have an byte length up to 32.
func decodeHash(s string) (common.Hash, error) {
	if strings.HasPrefix(s, "0x") || strings.HasPrefix(s, "0X") {
		s = s[2:]
	}
717 718 719
	if (len(s) & 1) > 0 {
		s = "0" + s
	}
720 721 722 723 724 725 726 727 728 729
	b, err := hex.DecodeString(s)
	if err != nil {
		return common.Hash{}, fmt.Errorf("hex string invalid")
	}
	if len(b) > 32 {
		return common.Hash{}, fmt.Errorf("hex string too long, want at most 32 bytes")
	}
	return common.BytesToHash(b), nil
}

730 731 732
// GetHeaderByNumber returns the requested canonical block header.
// * When blockNr is -1 the chain head is returned.
// * When blockNr is -2 the pending chain head is returned.
733
func (s *BlockChainAPI) GetHeaderByNumber(ctx context.Context, number rpc.BlockNumber) (map[string]interface{}, error) {
734 735
	header, err := s.b.HeaderByNumber(ctx, number)
	if header != nil && err == nil {
736
		response := s.rpcMarshalHeader(ctx, header)
737 738 739 740 741 742 743 744 745 746 747 748
		if number == rpc.PendingBlockNumber {
			// Pending header need to nil out a few fields
			for _, field := range []string{"hash", "nonce", "miner"} {
				response[field] = nil
			}
		}
		return response, err
	}
	return nil, err
}

// GetHeaderByHash returns the requested header by hash.
749
func (s *BlockChainAPI) GetHeaderByHash(ctx context.Context, hash common.Hash) map[string]interface{} {
750
	header, _ := s.b.HeaderByHash(ctx, hash)
751
	if header != nil {
752
		return s.rpcMarshalHeader(ctx, header)
753 754 755 756 757
	}
	return nil
}

// GetBlockByNumber returns the requested canonical block.
758 759 760 761
//   - When blockNr is -1 the chain head is returned.
//   - When blockNr is -2 the pending chain head is returned.
//   - When fullTx is true all transactions in the block are returned, otherwise
//     only the transaction hash is returned.
762
func (s *BlockChainAPI) GetBlockByNumber(ctx context.Context, number rpc.BlockNumber, fullTx bool) (map[string]interface{}, error) {
763 764
	block, err := s.b.BlockByNumber(ctx, number)
	if block != nil && err == nil {
765
		response, err := s.rpcMarshalBlock(ctx, block, true, fullTx)
766
		if err == nil && number == rpc.PendingBlockNumber {
767
			// Pending blocks need to nil out a few fields
768
			for _, field := range []string{"hash", "nonce", "miner"} {
769 770 771 772 773 774 775 776 777 778
				response[field] = nil
			}
		}
		return response, err
	}
	return nil, err
}

// GetBlockByHash returns the requested block. When fullTx is true all transactions in the block are returned in full
// detail, otherwise only the transaction hash is returned.
779
func (s *BlockChainAPI) GetBlockByHash(ctx context.Context, hash common.Hash, fullTx bool) (map[string]interface{}, error) {
780
	block, err := s.b.BlockByHash(ctx, hash)
781
	if block != nil {
782
		return s.rpcMarshalBlock(ctx, block, true, fullTx)
783 784 785 786
	}
	return nil, err
}

787
// GetUncleByBlockNumberAndIndex returns the uncle block for the given block hash and index.
788
func (s *BlockChainAPI) GetUncleByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) (map[string]interface{}, error) {
789 790 791
	block, err := s.b.BlockByNumber(ctx, blockNr)
	if block != nil {
		uncles := block.Uncles()
792
		if index >= hexutil.Uint(len(uncles)) {
793
			log.Debug("Requested uncle not found", "number", blockNr, "hash", block.Hash(), "index", index)
794 795
			return nil, nil
		}
796
		block = types.NewBlockWithHeader(uncles[index])
797
		return s.rpcMarshalBlock(ctx, block, false, false)
798 799 800 801
	}
	return nil, err
}

802
// GetUncleByBlockHashAndIndex returns the uncle block for the given block hash and index.
803
func (s *BlockChainAPI) GetUncleByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) (map[string]interface{}, error) {
804
	block, err := s.b.BlockByHash(ctx, blockHash)
805 806
	if block != nil {
		uncles := block.Uncles()
807
		if index >= hexutil.Uint(len(uncles)) {
808
			log.Debug("Requested uncle not found", "number", block.Number(), "hash", blockHash, "index", index)
809 810
			return nil, nil
		}
811
		block = types.NewBlockWithHeader(uncles[index])
812
		return s.rpcMarshalBlock(ctx, block, false, false)
813 814 815 816 817
	}
	return nil, err
}

// GetUncleCountByBlockNumber returns number of uncles in the block for the given block number
818
func (s *BlockChainAPI) GetUncleCountByBlockNumber(ctx context.Context, blockNr rpc.BlockNumber) *hexutil.Uint {
819
	if block, _ := s.b.BlockByNumber(ctx, blockNr); block != nil {
820 821
		n := hexutil.Uint(len(block.Uncles()))
		return &n
822 823 824 825 826
	}
	return nil
}

// GetUncleCountByBlockHash returns number of uncles in the block for the given block hash
827
func (s *BlockChainAPI) GetUncleCountByBlockHash(ctx context.Context, blockHash common.Hash) *hexutil.Uint {
828
	if block, _ := s.b.BlockByHash(ctx, blockHash); block != nil {
829 830
		n := hexutil.Uint(len(block.Uncles()))
		return &n
831 832 833 834 835
	}
	return nil
}

// GetCode returns the code stored at the given address in the state for the given block number.
836
func (s *BlockChainAPI) GetCode(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (hexutil.Bytes, error) {
837
	state, _, err := s.b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash)
838
	if state == nil || err != nil {
839
		return nil, err
840
	}
841 842
	code := state.GetCode(address)
	return code, state.Error()
843 844 845 846 847
}

// GetStorageAt returns the storage from the state at the given address, key and
// block number. The rpc.LatestBlockNumber and rpc.PendingBlockNumber meta block
// numbers are also allowed.
848
func (s *BlockChainAPI) GetStorageAt(ctx context.Context, address common.Address, hexKey string, blockNrOrHash rpc.BlockNumberOrHash) (hexutil.Bytes, error) {
849
	state, _, err := s.b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash)
850
	if state == nil || err != nil {
851
		return nil, err
852
	}
853 854 855 856 857
	key, err := decodeHash(hexKey)
	if err != nil {
		return nil, fmt.Errorf("unable to decode storage key: %s", err)
	}
	res := state.GetState(address, key)
858
	return res[:], state.Error()
859 860
}

861 862
// OverrideAccount indicates the overriding fields of account during the execution
// of a message call.
863 864 865 866
// Note, state and stateDiff can't be specified at the same time. If state is
// set, message execution will only use the data in the given state. Otherwise
// if statDiff is set, all diff will be applied first and then execute the call
// message.
867
type OverrideAccount struct {
868 869 870 871 872 873 874
	Nonce     *hexutil.Uint64              `json:"nonce"`
	Code      *hexutil.Bytes               `json:"code"`
	Balance   **hexutil.Big                `json:"balance"`
	State     *map[common.Hash]common.Hash `json:"state"`
	StateDiff *map[common.Hash]common.Hash `json:"stateDiff"`
}

875
// StateOverride is the collection of overridden accounts.
876
type StateOverride map[common.Address]OverrideAccount
877

878 879 880 881
// Apply overrides the fields of specified accounts into the given state.
func (diff *StateOverride) Apply(state *state.StateDB) error {
	if diff == nil {
		return nil
882
	}
883
	for addr, account := range *diff {
884 885 886 887 888 889 890 891 892 893 894 895 896
		// Override account nonce.
		if account.Nonce != nil {
			state.SetNonce(addr, uint64(*account.Nonce))
		}
		// Override account(contract) code.
		if account.Code != nil {
			state.SetCode(addr, *account.Code)
		}
		// Override account balance.
		if account.Balance != nil {
			state.SetBalance(addr, (*big.Int)(*account.Balance))
		}
		if account.State != nil && account.StateDiff != nil {
897
			return fmt.Errorf("account %s has both 'state' and 'stateDiff'", addr.Hex())
898 899 900 901 902 903 904 905 906 907 908 909
		}
		// Replace entire state if caller requires.
		if account.State != nil {
			state.SetStorage(addr, *account.State)
		}
		// Apply state diff into specified accounts.
		if account.StateDiff != nil {
			for key, value := range *account.StateDiff {
				state.SetState(addr, key, value)
			}
		}
	}
910 911 912
	return nil
}

913 914 915 916 917 918 919 920
// BlockOverrides is a set of header fields to override.
type BlockOverrides struct {
	Number     *hexutil.Big
	Difficulty *hexutil.Big
	Time       *hexutil.Big
	GasLimit   *hexutil.Uint64
	Coinbase   *common.Address
	Random     *common.Hash
921
	BaseFee    *hexutil.Big
922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946
}

// Apply overrides the given header fields into the given block context.
func (diff *BlockOverrides) Apply(blockCtx *vm.BlockContext) {
	if diff == nil {
		return
	}
	if diff.Number != nil {
		blockCtx.BlockNumber = diff.Number.ToInt()
	}
	if diff.Difficulty != nil {
		blockCtx.Difficulty = diff.Difficulty.ToInt()
	}
	if diff.Time != nil {
		blockCtx.Time = diff.Time.ToInt()
	}
	if diff.GasLimit != nil {
		blockCtx.GasLimit = uint64(*diff.GasLimit)
	}
	if diff.Coinbase != nil {
		blockCtx.Coinbase = *diff.Coinbase
	}
	if diff.Random != nil {
		blockCtx.Random = diff.Random
	}
947 948 949
	if diff.BaseFee != nil {
		blockCtx.BaseFee = diff.BaseFee.ToInt()
	}
950 951
}

952
func DoCall(ctx context.Context, b Backend, args TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *StateOverride, timeout time.Duration, globalGasCap uint64) (*core.ExecutionResult, error) {
953 954 955 956 957 958 959 960 961
	defer func(start time.Time) { log.Debug("Executing EVM call finished", "runtime", time.Since(start)) }(time.Now())

	state, header, err := b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash)
	if state == nil || err != nil {
		return nil, err
	}
	if err := overrides.Apply(state); err != nil {
		return nil, err
	}
962 963 964
	// Setup context so it may be cancelled the call has completed
	// or, in case of unmetered gas, setup a context with a timeout.
	var cancel context.CancelFunc
965 966
	if timeout > 0 {
		ctx, cancel = context.WithTimeout(ctx, timeout)
967 968
	} else {
		ctx, cancel = context.WithCancel(ctx)
969
	}
970 971
	// Make sure the context is cancelled when the call has completed
	// this makes sure resources are cleaned up.
972
	defer cancel()
973 974

	// Get a new instance of the EVM.
975 976 977 978
	msg, err := args.ToMessage(globalGasCap, header.BaseFee)
	if err != nil {
		return nil, err
	}
979
	evm, vmError, err := b.GetEVM(ctx, msg, state, header, &vm.Config{NoBaseFee: true})
980
	if err != nil {
981
		return nil, err
982 983 984 985
	}
	// Wait for the context to be done and cancel the evm. Even if the
	// EVM has finished, cancelling may be done (repeatedly)
	go func() {
986 987
		<-ctx.Done()
		evm.Cancel()
988 989
	}()

990
	// Execute the message.
991
	gp := new(core.GasPool).AddGas(math.MaxUint64)
992
	result, err := core.ApplyMessage(evm, msg, gp)
993
	if err := vmError(); err != nil {
994
		return nil, err
995
	}
996

997 998
	// If the timer caused an abort, return an appropriate error message
	if evm.Cancelled() {
999
		return nil, fmt.Errorf("execution aborted (timeout = %v)", timeout)
1000
	}
1001 1002 1003 1004
	if err != nil {
		return result, fmt.Errorf("err: %w (supplied gas %d)", err, msg.Gas())
	}
	return result, nil
1005 1006
}

1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018
func newRevertError(result *core.ExecutionResult) *revertError {
	reason, errUnpack := abi.UnpackRevert(result.Revert())
	err := errors.New("execution reverted")
	if errUnpack == nil {
		err = fmt.Errorf("execution reverted: %v", reason)
	}
	return &revertError{
		error:  err,
		reason: hexutil.Encode(result.Revert()),
	}
}

1019
// revertError is an API error that encompasses an EVM revertal with JSON error
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036
// code and a binary data blob.
type revertError struct {
	error
	reason string // revert reason hex encoded
}

// ErrorCode returns the JSON error code for a revertal.
// See: https://github.com/ethereum/wiki/wiki/JSON-RPC-Error-Codes-Improvement-Proposal
func (e *revertError) ErrorCode() int {
	return 3
}

// ErrorData returns the hex encoded revert reason.
func (e *revertError) ErrorData() interface{} {
	return e.reason
}

1037
// Call executes the given transaction on the state for the given block number.
1038 1039 1040 1041 1042
//
// Additionally, the caller can specify a batch of contract for fields overriding.
//
// Note, this function doesn't make and changes in the state/blockchain and is
// useful to execute and retrieve values.
1043
func (s *BlockChainAPI) Call(ctx context.Context, args TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *StateOverride) (hexutil.Bytes, error) {
1044
	result, err := DoCall(ctx, s.b, args, blockNrOrHash, overrides, s.b.RPCEVMTimeout(), s.b.RPCGasCap())
1045 1046 1047
	if err != nil {
		return nil, err
	}
1048 1049 1050
	// If the result contains a revert reason, try to unpack and return it.
	if len(result.Revert()) > 0 {
		return nil, newRevertError(result)
1051
	}
1052
	return result.Return(), result.Err
1053 1054
}

1055
func DoEstimateGas(ctx context.Context, b Backend, args TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, gasCap uint64) (hexutil.Uint64, error) {
1056
	// Binary search the gas requirement, as it may be higher than the amount used
1057
	var (
1058 1059 1060
		lo  uint64 = params.TxGas - 1
		hi  uint64
		cap uint64
1061
	)
1062 1063 1064 1065 1066
	// Use zero address if sender unspecified.
	if args.From == nil {
		args.From = new(common.Address)
	}
	// Determine the highest gas limit can be used during the estimation.
1067 1068
	if args.Gas != nil && uint64(*args.Gas) >= params.TxGas {
		hi = uint64(*args.Gas)
1069
	} else {
1070
		// Retrieve the block to act as the gas ceiling
1071
		block, err := b.BlockByNumberOrHash(ctx, blockNrOrHash)
1072
		if err != nil {
1073
			return 0, err
1074
		}
1075 1076 1077
		if block == nil {
			return 0, errors.New("block not found")
		}
1078
		hi = block.GasLimit()
1079
	}
1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090
	// Normalize the max fee per gas the call is willing to spend.
	var feeCap *big.Int
	if args.GasPrice != nil && (args.MaxFeePerGas != nil || args.MaxPriorityFeePerGas != nil) {
		return 0, errors.New("both gasPrice and (maxFeePerGas or maxPriorityFeePerGas) specified")
	} else if args.GasPrice != nil {
		feeCap = args.GasPrice.ToInt()
	} else if args.MaxFeePerGas != nil {
		feeCap = args.MaxFeePerGas.ToInt()
	} else {
		feeCap = common.Big0
	}
1091
	// Recap the highest gas limit with account's available balance.
1092
	if feeCap.BitLen() != 0 {
1093 1094 1095 1096 1097 1098 1099 1100
		state, _, err := b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash)
		if err != nil {
			return 0, err
		}
		balance := state.GetBalance(*args.From) // from can't be nil
		available := new(big.Int).Set(balance)
		if args.Value != nil {
			if args.Value.ToInt().Cmp(available) >= 0 {
1101
				return 0, core.ErrInsufficientFundsForTransfer
1102 1103 1104
			}
			available.Sub(available, args.Value.ToInt())
		}
1105
		allowance := new(big.Int).Div(available, feeCap)
1106 1107 1108

		// If the allowance is larger than maximum uint64, skip checking
		if allowance.IsUint64() && hi > allowance.Uint64() {
1109 1110 1111 1112 1113
			transfer := args.Value
			if transfer == nil {
				transfer = new(hexutil.Big)
			}
			log.Warn("Gas estimation capped by limited funds", "original", hi, "balance", balance,
1114
				"sent", transfer.ToInt(), "maxFeePerGas", feeCap, "fundable", allowance)
1115 1116 1117 1118
			hi = allowance.Uint64()
		}
	}
	// Recap the highest gas allowance with specified gascap.
1119
	if gasCap != 0 && hi > gasCap {
1120
		log.Warn("Caller gas above allowance, capping", "requested", hi, "cap", gasCap)
1121
		hi = gasCap
1122
	}
1123
	cap = hi
1124

1125
	// Create a helper to check if a gas allowance results in an executable transaction
1126
	executable := func(gas uint64) (bool, *core.ExecutionResult, error) {
1127
		args.Gas = (*hexutil.Uint64)(&gas)
1128

1129
		result, err := DoCall(ctx, b, args, blockNrOrHash, nil, 0, gasCap)
1130
		if err != nil {
1131
			if errors.Is(err, core.ErrIntrinsicGas) {
1132 1133 1134
				return true, nil, nil // Special case, raise gas limit
			}
			return true, nil, err // Bail out
1135
		}
1136
		return result.Failed(), result, nil
1137 1138 1139 1140
	}
	// Execute the binary search and hone in on an executable gas limit
	for lo+1 < hi {
		mid := (hi + lo) / 2
1141 1142 1143 1144
		failed, _, err := executable(mid)

		// If the error is not nil(consensus error), it means the provided message
		// call or transaction will never be accepted no matter how much gas it is
1145
		// assigned. Return the error directly, don't struggle any more.
1146 1147 1148 1149
		if err != nil {
			return 0, err
		}
		if failed {
1150
			lo = mid
1151 1152 1153 1154 1155 1156
		} else {
			hi = mid
		}
	}
	// Reject the transaction as invalid if it still fails at the highest allowance
	if hi == cap {
1157 1158 1159 1160 1161 1162 1163
		failed, result, err := executable(hi)
		if err != nil {
			return 0, err
		}
		if failed {
			if result != nil && result.Err != vm.ErrOutOfGas {
				if len(result.Revert()) > 0 {
1164
					return 0, newRevertError(result)
1165
				}
1166
				return 0, result.Err
1167 1168
			}
			// Otherwise, the specified gas cap is too low
1169
			return 0, fmt.Errorf("gas required exceeds allowance (%d)", cap)
1170 1171
		}
	}
1172
	return hexutil.Uint64(hi), nil
1173 1174
}

1175 1176
// EstimateGas returns an estimate of the amount of gas needed to execute the
// given transaction against the current pending block.
1177
func (s *BlockChainAPI) EstimateGas(ctx context.Context, args TransactionArgs, blockNrOrHash *rpc.BlockNumberOrHash) (hexutil.Uint64, error) {
1178 1179 1180 1181 1182
	bNrOrHash := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber)
	if blockNrOrHash != nil {
		bNrOrHash = *blockNrOrHash
	}
	return DoEstimateGas(ctx, s.b, args, bNrOrHash, s.b.RPCGasCap())
1183 1184
}

1185
// RPCMarshalHeader converts the given header to the RPC output .
1186
func RPCMarshalHeader(head *types.Header) map[string]interface{} {
1187
	result := map[string]interface{}{
1188
		"number":           (*hexutil.Big)(head.Number),
1189
		"hash":             head.Hash(),
1190 1191 1192 1193 1194 1195
		"parentHash":       head.ParentHash,
		"nonce":            head.Nonce,
		"mixHash":          head.MixDigest,
		"sha3Uncles":       head.UncleHash,
		"logsBloom":        head.Bloom,
		"stateRoot":        head.Root,
1196
		"miner":            head.Coinbase,
1197
		"difficulty":       (*hexutil.Big)(head.Difficulty),
1198
		"extraData":        hexutil.Bytes(head.Extra),
1199
		"size":             hexutil.Uint64(head.Size()),
1200 1201
		"gasLimit":         hexutil.Uint64(head.GasLimit),
		"gasUsed":          hexutil.Uint64(head.GasUsed),
1202
		"timestamp":        hexutil.Uint64(head.Time),
1203
		"transactionsRoot": head.TxHash,
1204
		"receiptsRoot":     head.ReceiptHash,
1205
	}
1206 1207 1208 1209 1210 1211

	if head.BaseFee != nil {
		result["baseFeePerGas"] = (*hexutil.Big)(head.BaseFee)
	}

	return result
1212 1213 1214 1215 1216
}

// RPCMarshalBlock converts the given block to the RPC output which depends on fullTx. If inclTx is true transactions are
// returned. When fullTx is true the returned block contains full transaction details, otherwise it will only contain
// transaction hashes.
1217
func RPCMarshalBlock(block *types.Block, inclTx bool, fullTx bool, config *params.ChainConfig) (map[string]interface{}, error) {
1218
	fields := RPCMarshalHeader(block.Header())
1219
	fields["size"] = hexutil.Uint64(block.Size())
1220 1221 1222 1223 1224 1225 1226

	if inclTx {
		formatTx := func(tx *types.Transaction) (interface{}, error) {
			return tx.Hash(), nil
		}
		if fullTx {
			formatTx = func(tx *types.Transaction) (interface{}, error) {
1227
				return newRPCTransactionFromBlockHash(block, tx.Hash(), config), nil
1228 1229
			}
		}
1230
		txs := block.Transactions()
1231 1232
		transactions := make([]interface{}, len(txs))
		var err error
1233
		for i, tx := range txs {
1234 1235 1236 1237 1238 1239
			if transactions[i], err = formatTx(tx); err != nil {
				return nil, err
			}
		}
		fields["transactions"] = transactions
	}
1240
	uncles := block.Uncles()
1241 1242 1243 1244 1245 1246 1247 1248 1249
	uncleHashes := make([]common.Hash, len(uncles))
	for i, uncle := range uncles {
		uncleHashes[i] = uncle.Hash()
	}
	fields["uncles"] = uncleHashes

	return fields, nil
}

1250
// rpcMarshalHeader uses the generalized output filler, then adds the total difficulty field, which requires
1251 1252
// a `BlockchainAPI`.
func (s *BlockChainAPI) rpcMarshalHeader(ctx context.Context, header *types.Header) map[string]interface{} {
1253
	fields := RPCMarshalHeader(header)
1254
	fields["totalDifficulty"] = (*hexutil.Big)(s.b.GetTd(ctx, header.Hash()))
1255 1256 1257 1258
	return fields
}

// rpcMarshalBlock uses the generalized output filler, then adds the total difficulty field, which requires
1259 1260
// a `BlockchainAPI`.
func (s *BlockChainAPI) rpcMarshalBlock(ctx context.Context, b *types.Block, inclTx bool, fullTx bool) (map[string]interface{}, error) {
1261
	fields, err := RPCMarshalBlock(b, inclTx, fullTx, s.b.ChainConfig())
1262 1263 1264
	if err != nil {
		return nil, err
	}
1265
	if inclTx {
1266
		fields["totalDifficulty"] = (*hexutil.Big)(s.b.GetTd(ctx, b.Hash()))
1267
	}
1268 1269 1270
	return fields, err
}

1271 1272
// RPCTransaction represents a transaction that will serialize to the RPC representation of a transaction
type RPCTransaction struct {
1273 1274 1275 1276 1277
	BlockHash        *common.Hash      `json:"blockHash"`
	BlockNumber      *hexutil.Big      `json:"blockNumber"`
	From             common.Address    `json:"from"`
	Gas              hexutil.Uint64    `json:"gas"`
	GasPrice         *hexutil.Big      `json:"gasPrice"`
1278 1279
	GasFeeCap        *hexutil.Big      `json:"maxFeePerGas,omitempty"`
	GasTipCap        *hexutil.Big      `json:"maxPriorityFeePerGas,omitempty"`
1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291
	Hash             common.Hash       `json:"hash"`
	Input            hexutil.Bytes     `json:"input"`
	Nonce            hexutil.Uint64    `json:"nonce"`
	To               *common.Address   `json:"to"`
	TransactionIndex *hexutil.Uint64   `json:"transactionIndex"`
	Value            *hexutil.Big      `json:"value"`
	Type             hexutil.Uint64    `json:"type"`
	Accesses         *types.AccessList `json:"accessList,omitempty"`
	ChainID          *hexutil.Big      `json:"chainId,omitempty"`
	V                *hexutil.Big      `json:"v"`
	R                *hexutil.Big      `json:"r"`
	S                *hexutil.Big      `json:"s"`
1292 1293
}

1294 1295
// newRPCTransaction returns a transaction that will serialize to the RPC
// representation, with the given location metadata set (if available).
1296
func newRPCTransaction(tx *types.Transaction, blockHash common.Hash, blockNumber uint64, index uint64, baseFee *big.Int, config *params.ChainConfig) *RPCTransaction {
1297
	signer := types.MakeSigner(config, new(big.Int).SetUint64(blockNumber))
1298
	from, _ := types.Sender(signer, tx)
1299
	v, r, s := tx.RawSignatureValues()
1300
	result := &RPCTransaction{
1301
		Type:     hexutil.Uint64(tx.Type()),
1302
		From:     from,
1303
		Gas:      hexutil.Uint64(tx.Gas()),
1304
		GasPrice: (*hexutil.Big)(tx.GasPrice()),
1305
		Hash:     tx.Hash(),
1306
		Input:    hexutil.Bytes(tx.Data()),
1307
		Nonce:    hexutil.Uint64(tx.Nonce()),
1308
		To:       tx.To(),
1309 1310 1311 1312
		Value:    (*hexutil.Big)(tx.Value()),
		V:        (*hexutil.Big)(v),
		R:        (*hexutil.Big)(r),
		S:        (*hexutil.Big)(s),
1313
	}
1314
	if blockHash != (common.Hash{}) {
1315
		result.BlockHash = &blockHash
1316
		result.BlockNumber = (*hexutil.Big)(new(big.Int).SetUint64(blockNumber))
1317
		result.TransactionIndex = (*hexutil.Uint64)(&index)
1318
	}
1319
	switch tx.Type() {
1320 1321
	case types.LegacyTxType:
		// if a legacy transaction has an EIP-155 chain id, include it explicitly
1322
		if id := tx.ChainId(); id.Sign() != 0 {
1323 1324
			result.ChainID = (*hexutil.Big)(id)
		}
1325 1326 1327 1328 1329
	case types.AccessListTxType:
		al := tx.AccessList()
		result.Accesses = &al
		result.ChainID = (*hexutil.Big)(tx.ChainId())
	case types.DynamicFeeTxType:
1330 1331 1332
		al := tx.AccessList()
		result.Accesses = &al
		result.ChainID = (*hexutil.Big)(tx.ChainId())
1333 1334
		result.GasFeeCap = (*hexutil.Big)(tx.GasFeeCap())
		result.GasTipCap = (*hexutil.Big)(tx.GasTipCap())
1335 1336
		// if the transaction has been mined, compute the effective gas price
		if baseFee != nil && blockHash != (common.Hash{}) {
1337 1338
			// price = min(tip, gasFeeCap - baseFee) + baseFee
			price := math.BigMin(new(big.Int).Add(tx.GasTipCap(), baseFee), tx.GasFeeCap())
1339 1340
			result.GasPrice = (*hexutil.Big)(price)
		} else {
1341
			result.GasPrice = (*hexutil.Big)(tx.GasFeeCap())
1342
		}
1343
	}
1344
	return result
1345 1346
}

1347
// newRPCPendingTransaction returns a pending transaction that will serialize to the RPC representation
1348 1349
func newRPCPendingTransaction(tx *types.Transaction, current *types.Header, config *params.ChainConfig) *RPCTransaction {
	var baseFee *big.Int
1350
	blockNumber := uint64(0)
1351 1352
	if current != nil {
		baseFee = misc.CalcBaseFee(config, current)
1353
		blockNumber = current.Number.Uint64()
1354
	}
1355
	return newRPCTransaction(tx, common.Hash{}, blockNumber, 0, baseFee, config)
1356 1357
}

1358
// newRPCTransactionFromBlockIndex returns a transaction that will serialize to the RPC representation.
1359
func newRPCTransactionFromBlockIndex(b *types.Block, index uint64, config *params.ChainConfig) *RPCTransaction {
1360 1361 1362
	txs := b.Transactions()
	if index >= uint64(len(txs)) {
		return nil
1363
	}
1364
	return newRPCTransaction(txs[index], b.Hash(), b.NumberU64(), index, b.BaseFee(), config)
1365
}
1366

1367 1368 1369 1370 1371 1372
// newRPCRawTransactionFromBlockIndex returns the bytes of a transaction given a block and a transaction index.
func newRPCRawTransactionFromBlockIndex(b *types.Block, index uint64) hexutil.Bytes {
	txs := b.Transactions()
	if index >= uint64(len(txs)) {
		return nil
	}
1373
	blob, _ := txs[index].MarshalBinary()
1374
	return blob
1375 1376
}

1377
// newRPCTransactionFromBlockHash returns a transaction that will serialize to the RPC representation.
1378
func newRPCTransactionFromBlockHash(b *types.Block, hash common.Hash, config *params.ChainConfig) *RPCTransaction {
1379
	for idx, tx := range b.Transactions() {
1380
		if tx.Hash() == hash {
1381
			return newRPCTransactionFromBlockIndex(b, uint64(idx), config)
1382 1383
		}
	}
1384
	return nil
1385 1386
}

1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397
// accessListResult returns an optional accesslist
// Its the result of the `debug_createAccessList` RPC call.
// It contains an error if the transaction itself failed.
type accessListResult struct {
	Accesslist *types.AccessList `json:"accessList"`
	Error      string            `json:"error,omitempty"`
	GasUsed    hexutil.Uint64    `json:"gasUsed"`
}

// CreateAccessList creates a EIP-2930 type AccessList for the given transaction.
// Reexec and BlockNrOrHash can be specified to create the accessList on top of a certain state.
1398
func (s *BlockChainAPI) CreateAccessList(ctx context.Context, args TransactionArgs, blockNrOrHash *rpc.BlockNumberOrHash) (*accessListResult, error) {
1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416
	bNrOrHash := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber)
	if blockNrOrHash != nil {
		bNrOrHash = *blockNrOrHash
	}
	acl, gasUsed, vmerr, err := AccessList(ctx, s.b, bNrOrHash, args)
	if err != nil {
		return nil, err
	}
	result := &accessListResult{Accesslist: &acl, GasUsed: hexutil.Uint64(gasUsed)}
	if vmerr != nil {
		result.Error = vmerr.Error()
	}
	return result, nil
}

// AccessList creates an access list for the given transaction.
// If the accesslist creation fails an error is returned.
// If the transaction itself fails, an vmErr is returned.
1417
func AccessList(ctx context.Context, b Backend, blockNrOrHash rpc.BlockNumberOrHash, args TransactionArgs) (acl types.AccessList, gasUsed uint64, vmErr error, err error) {
1418 1419 1420 1421 1422
	// Retrieve the execution context
	db, header, err := b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash)
	if db == nil || err != nil {
		return nil, 0, nil, err
	}
1423 1424 1425 1426 1427
	// If the gas amount is not set, default to RPC gas cap.
	if args.Gas == nil {
		tmp := hexutil.Uint64(b.RPCGasCap())
		args.Gas = &tmp
	}
1428 1429 1430 1431 1432 1433 1434 1435 1436

	// Ensure any missing fields are filled, extract the recipient and input data
	if err := args.setDefaults(ctx, b); err != nil {
		return nil, 0, nil, err
	}
	var to common.Address
	if args.To != nil {
		to = *args.To
	} else {
1437
		to = crypto.CreateAddress(args.from(), uint64(*args.Nonce))
1438
	}
1439
	isPostMerge := header.Difficulty.Cmp(common.Big0) == 0
1440
	// Retrieve the precompiles since they don't need to be added to the access list
1441
	precompiles := vm.ActivePrecompiles(b.ChainConfig().Rules(header.Number, isPostMerge))
1442 1443

	// Create an initial tracer
1444
	prevTracer := logger.NewAccessListTracer(nil, args.from(), to, precompiles)
1445
	if args.AccessList != nil {
1446
		prevTracer = logger.NewAccessListTracer(*args.AccessList, args.from(), to, precompiles)
1447 1448 1449 1450 1451 1452 1453 1454
	}
	for {
		// Retrieve the current access list to expand
		accessList := prevTracer.AccessList()
		log.Trace("Creating access list", "input", accessList)

		// Copy the original db so we don't modify it
		statedb := db.Copy()
1455 1456 1457 1458 1459 1460
		// Set the accesslist to the last al
		args.AccessList = &accessList
		msg, err := args.ToMessage(b.RPCGasCap(), header.BaseFee)
		if err != nil {
			return nil, 0, nil, err
		}
1461 1462

		// Apply the transaction with the access list tracer
1463
		tracer := logger.NewAccessListTracer(accessList, args.from(), to, precompiles)
1464
		config := vm.Config{Tracer: tracer, Debug: true, NoBaseFee: true}
1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479
		vmenv, _, err := b.GetEVM(ctx, msg, statedb, header, &config)
		if err != nil {
			return nil, 0, nil, err
		}
		res, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas()))
		if err != nil {
			return nil, 0, nil, fmt.Errorf("failed to apply transaction: %v err: %v", args.toTransaction().Hash(), err)
		}
		if tracer.Equal(prevTracer) {
			return accessList, res.UsedGas, res.Err, nil
		}
		prevTracer = tracer
	}
}

1480 1481
// TransactionAPI exposes methods for reading and creating transaction data.
type TransactionAPI struct {
1482 1483
	b         Backend
	nonceLock *AddrLocker
1484
	signer    types.Signer
1485 1486
}

1487 1488
// NewTransactionAPI creates a new RPC service with methods for interacting with transactions.
func NewTransactionAPI(b Backend, nonceLock *AddrLocker) *TransactionAPI {
1489 1490 1491
	// The signer used by the API should always be the 'latest' known one because we expect
	// signers to be backwards-compatible with old transactions.
	signer := types.LatestSigner(b.ChainConfig())
1492
	return &TransactionAPI{b, nonceLock, signer}
1493 1494 1495
}

// GetBlockTransactionCountByNumber returns the number of transactions in the block with the given block number.
1496
func (s *TransactionAPI) GetBlockTransactionCountByNumber(ctx context.Context, blockNr rpc.BlockNumber) *hexutil.Uint {
1497
	if block, _ := s.b.BlockByNumber(ctx, blockNr); block != nil {
1498 1499
		n := hexutil.Uint(len(block.Transactions()))
		return &n
1500 1501 1502 1503 1504
	}
	return nil
}

// GetBlockTransactionCountByHash returns the number of transactions in the block with the given hash.
1505
func (s *TransactionAPI) GetBlockTransactionCountByHash(ctx context.Context, blockHash common.Hash) *hexutil.Uint {
1506
	if block, _ := s.b.BlockByHash(ctx, blockHash); block != nil {
1507 1508
		n := hexutil.Uint(len(block.Transactions()))
		return &n
1509 1510 1511 1512 1513
	}
	return nil
}

// GetTransactionByBlockNumberAndIndex returns the transaction for the given block number and index.
1514
func (s *TransactionAPI) GetTransactionByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) *RPCTransaction {
1515
	if block, _ := s.b.BlockByNumber(ctx, blockNr); block != nil {
1516
		return newRPCTransactionFromBlockIndex(block, uint64(index), s.b.ChainConfig())
1517
	}
1518
	return nil
1519 1520 1521
}

// GetTransactionByBlockHashAndIndex returns the transaction for the given block hash and index.
1522
func (s *TransactionAPI) GetTransactionByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) *RPCTransaction {
1523
	if block, _ := s.b.BlockByHash(ctx, blockHash); block != nil {
1524
		return newRPCTransactionFromBlockIndex(block, uint64(index), s.b.ChainConfig())
1525
	}
1526
	return nil
1527 1528
}

1529
// GetRawTransactionByBlockNumberAndIndex returns the bytes of the transaction for the given block number and index.
1530
func (s *TransactionAPI) GetRawTransactionByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) hexutil.Bytes {
1531
	if block, _ := s.b.BlockByNumber(ctx, blockNr); block != nil {
1532
		return newRPCRawTransactionFromBlockIndex(block, uint64(index))
1533
	}
1534
	return nil
1535 1536 1537
}

// GetRawTransactionByBlockHashAndIndex returns the bytes of the transaction for the given block hash and index.
1538
func (s *TransactionAPI) GetRawTransactionByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) hexutil.Bytes {
1539
	if block, _ := s.b.BlockByHash(ctx, blockHash); block != nil {
1540
		return newRPCRawTransactionFromBlockIndex(block, uint64(index))
1541
	}
1542
	return nil
1543 1544
}

1545
// GetTransactionCount returns the number of transactions the given address has sent for the given block number
1546
func (s *TransactionAPI) GetTransactionCount(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (*hexutil.Uint64, error) {
1547
	// Ask transaction pool for the nonce which includes pending transactions
1548
	if blockNr, ok := blockNrOrHash.Number(); ok && blockNr == rpc.PendingBlockNumber {
1549 1550 1551 1552 1553 1554 1555
		nonce, err := s.b.GetPoolNonce(ctx, address)
		if err != nil {
			return nil, err
		}
		return (*hexutil.Uint64)(&nonce), nil
	}
	// Resolve block number and use its state to ask for the nonce
1556
	state, _, err := s.b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash)
1557 1558 1559
	if state == nil || err != nil {
		return nil, err
	}
1560 1561
	nonce := state.GetNonce(address)
	return (*hexutil.Uint64)(&nonce), state.Error()
1562 1563 1564
}

// GetTransactionByHash returns the transaction for the given hash
1565
func (s *TransactionAPI) GetTransactionByHash(ctx context.Context, hash common.Hash) (*RPCTransaction, error) {
1566
	// Try to return an already finalized transaction
1567 1568 1569 1570 1571
	tx, blockHash, blockNumber, index, err := s.b.GetTransaction(ctx, hash)
	if err != nil {
		return nil, err
	}
	if tx != nil {
1572 1573 1574 1575
		header, err := s.b.HeaderByHash(ctx, blockHash)
		if err != nil {
			return nil, err
		}
1576
		return newRPCTransaction(tx, blockHash, blockNumber, index, header.BaseFee, s.b.ChainConfig()), nil
1577
	}
1578 1579
	// No finalized transaction, try to retrieve it from the pool
	if tx := s.b.GetPoolTransaction(hash); tx != nil {
1580
		return newRPCPendingTransaction(tx, s.b.CurrentHeader(), s.b.ChainConfig()), nil
1581
	}
1582

1583
	// Transaction unknown, return as such
1584
	return nil, nil
1585 1586
}

1587
// GetRawTransactionByHash returns the bytes of the transaction for the given hash.
1588
func (s *TransactionAPI) GetRawTransactionByHash(ctx context.Context, hash common.Hash) (hexutil.Bytes, error) {
1589
	// Retrieve a finalized transaction, or a pooled otherwise
1590 1591 1592 1593 1594
	tx, _, _, _, err := s.b.GetTransaction(ctx, hash)
	if err != nil {
		return nil, err
	}
	if tx == nil {
1595 1596 1597 1598
		if tx = s.b.GetPoolTransaction(hash); tx == nil {
			// Transaction not found anywhere, abort
			return nil, nil
		}
1599
	}
1600
	// Serialize to RLP and return
1601
	return tx.MarshalBinary()
1602 1603
}

1604
// GetTransactionReceipt returns the transaction receipt for the given transaction hash.
1605
func (s *TransactionAPI) GetTransactionReceipt(ctx context.Context, hash common.Hash) (map[string]interface{}, error) {
1606 1607
	tx, blockHash, blockNumber, index, err := s.b.GetTransaction(ctx, hash)
	if err != nil {
1608 1609
		// When the transaction doesn't exist, the RPC method should return JSON null
		// as per specification.
1610
		return nil, nil
1611
	}
1612 1613 1614 1615 1616
	receipts, err := s.b.GetReceipts(ctx, blockHash)
	if err != nil {
		return nil, err
	}
	if len(receipts) <= int(index) {
1617
		return nil, nil
1618
	}
1619
	receipt := receipts[index]
1620

1621 1622 1623
	// Derive the sender.
	bigblock := new(big.Int).SetUint64(blockNumber)
	signer := types.MakeSigner(s.b.ChainConfig(), bigblock)
1624
	from, _ := types.Sender(signer, tx)
1625 1626

	fields := map[string]interface{}{
1627 1628
		"blockHash":         blockHash,
		"blockNumber":       hexutil.Uint64(blockNumber),
1629
		"transactionHash":   hash,
1630
		"transactionIndex":  hexutil.Uint64(index),
1631 1632
		"from":              from,
		"to":                tx.To(),
1633 1634
		"gasUsed":           hexutil.Uint64(receipt.GasUsed),
		"cumulativeGasUsed": hexutil.Uint64(receipt.CumulativeGasUsed),
1635 1636
		"contractAddress":   nil,
		"logs":              receipt.Logs,
1637
		"logsBloom":         receipt.Bloom,
1638
		"type":              hexutil.Uint(tx.Type()),
1639
	}
1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650
	// Assign the effective gas price paid
	if !s.b.ChainConfig().IsLondon(bigblock) {
		fields["effectiveGasPrice"] = hexutil.Uint64(tx.GasPrice().Uint64())
	} else {
		header, err := s.b.HeaderByHash(ctx, blockHash)
		if err != nil {
			return nil, err
		}
		gasPrice := new(big.Int).Add(header.BaseFee, tx.EffectiveGasTipValue(header.BaseFee))
		fields["effectiveGasPrice"] = hexutil.Uint64(gasPrice.Uint64())
	}
1651 1652 1653 1654
	// Assign receipt status or post state.
	if len(receipt.PostState) > 0 {
		fields["root"] = hexutil.Bytes(receipt.PostState)
	} else {
1655
		fields["status"] = hexutil.Uint(receipt.Status)
1656
	}
1657
	if receipt.Logs == nil {
1658
		fields["logs"] = []*types.Log{}
1659 1660
	}
	// If the ContractAddress is 20 0x0 bytes, assume it is not a contract creation
1661
	if receipt.ContractAddress != (common.Address{}) {
1662 1663 1664 1665 1666 1667
		fields["contractAddress"] = receipt.ContractAddress
	}
	return fields, nil
}

// sign is a helper function that signs a transaction with the private key of the given address.
1668
func (s *TransactionAPI) sign(addr common.Address, tx *types.Transaction) (*types.Transaction, error) {
1669 1670 1671 1672 1673 1674 1675 1676
	// Look up the wallet containing the requested signer
	account := accounts.Account{Address: addr}

	wallet, err := s.b.AccountManager().Find(account)
	if err != nil {
		return nil, err
	}
	// Request the wallet to sign the transaction
1677
	return wallet.SignTx(account, tx, s.b.ChainConfig().ChainID)
1678 1679
}

1680 1681
// SubmitTransaction is a helper function that submits tx to txPool and logs a message.
func SubmitTransaction(ctx context.Context, b Backend, tx *types.Transaction) (common.Hash, error) {
1682 1683
	// If the transaction fee cap is already specified, ensure the
	// fee of the given transaction is _reasonable_.
1684 1685
	if err := checkTxFee(tx.GasPrice(), tx.Gas(), b.RPCTxFeeCap()); err != nil {
		return common.Hash{}, err
1686
	}
1687 1688 1689 1690
	if !b.UnprotectedAllowed() && !tx.Protected() {
		// Ensure only eip155 signed transactions are submitted if EIP155Required is set.
		return common.Hash{}, errors.New("only replay-protected (EIP-155) transactions allowed over RPC")
	}
1691
	if err := b.SendTx(ctx, tx); err != nil {
1692 1693
		return common.Hash{}, err
	}
1694 1695 1696 1697 1698 1699 1700
	// Print a log with full tx details for manual investigations and interventions
	signer := types.MakeSigner(b.ChainConfig(), b.CurrentBlock().Number())
	from, err := types.Sender(signer, tx)
	if err != nil {
		return common.Hash{}, err
	}

1701 1702
	if tx.To() == nil {
		addr := crypto.CreateAddress(from, tx.Nonce())
1703
		log.Info("Submitted contract creation", "hash", tx.Hash().Hex(), "from", from, "nonce", tx.Nonce(), "contract", addr.Hex(), "value", tx.Value())
1704
	} else {
1705
		log.Info("Submitted transaction", "hash", tx.Hash().Hex(), "from", from, "nonce", tx.Nonce(), "recipient", tx.To(), "value", tx.Value())
1706
	}
1707
	return tx.Hash(), nil
1708 1709 1710 1711
}

// SendTransaction creates a transaction for the given argument, sign it and submit it to the
// transaction pool.
1712
func (s *TransactionAPI) SendTransaction(ctx context.Context, args TransactionArgs) (common.Hash, error) {
1713
	// Look up the wallet containing the requested signer
1714
	account := accounts.Account{Address: args.from()}
1715 1716 1717 1718 1719

	wallet, err := s.b.AccountManager().Find(account)
	if err != nil {
		return common.Hash{}, err
	}
1720 1721

	if args.Nonce == nil {
1722
		// Hold the mutex around signing to prevent concurrent assignment of
1723
		// the same nonce to multiple accounts.
1724 1725
		s.nonceLock.LockAddr(args.from())
		defer s.nonceLock.UnlockAddr(args.from())
1726 1727 1728 1729 1730 1731
	}

	// Set some sanity defaults and terminate on failure
	if err := args.setDefaults(ctx, s.b); err != nil {
		return common.Hash{}, err
	}
1732
	// Assemble the transaction and sign with the wallet
1733
	tx := args.toTransaction()
1734

1735
	signed, err := wallet.SignTx(account, tx, s.b.ChainConfig().ChainID)
1736 1737 1738
	if err != nil {
		return common.Hash{}, err
	}
1739
	return SubmitTransaction(ctx, s.b, signed)
1740 1741
}

1742 1743 1744
// FillTransaction fills the defaults (nonce, gas, gasPrice or 1559 fields)
// on a given unsigned transaction, and returns it to the caller for further
// processing (signing + broadcast).
1745
func (s *TransactionAPI) FillTransaction(ctx context.Context, args TransactionArgs) (*SignTransactionResult, error) {
1746 1747 1748 1749 1750 1751
	// Set some sanity defaults and terminate on failure
	if err := args.setDefaults(ctx, s.b); err != nil {
		return nil, err
	}
	// Assemble the transaction and obtain rlp
	tx := args.toTransaction()
1752
	data, err := tx.MarshalBinary()
1753 1754 1755 1756 1757 1758
	if err != nil {
		return nil, err
	}
	return &SignTransactionResult{data, tx}, nil
}

1759 1760
// SendRawTransaction will add the signed transaction to the transaction pool.
// The sender is responsible for signing the transaction and using the correct nonce.
1761
func (s *TransactionAPI) SendRawTransaction(ctx context.Context, input hexutil.Bytes) (common.Hash, error) {
1762
	tx := new(types.Transaction)
1763
	if err := tx.UnmarshalBinary(input); err != nil {
1764
		return common.Hash{}, err
1765
	}
1766
	return SubmitTransaction(ctx, s.b, tx)
1767 1768
}

1769
// Sign calculates an ECDSA signature for:
1770
// keccak256("\x19Ethereum Signed Message:\n" + len(message) + message).
1771
//
1772 1773 1774
// Note, the produced signature conforms to the secp256k1 curve R, S and V values,
// where the V value will be 27 or 28 for legacy reasons.
//
1775 1776 1777
// The account associated with addr must be unlocked.
//
// https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign
1778
func (s *TransactionAPI) Sign(addr common.Address, data hexutil.Bytes) (hexutil.Bytes, error) {
1779 1780 1781 1782 1783 1784 1785 1786
	// Look up the wallet containing the requested signer
	account := accounts.Account{Address: addr}

	wallet, err := s.b.AccountManager().Find(account)
	if err != nil {
		return nil, err
	}
	// Sign the requested hash with the wallet
1787
	signature, err := wallet.SignText(account, data)
1788
	if err == nil {
1789
		signature[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper
1790 1791
	}
	return signature, err
1792 1793 1794 1795
}

// SignTransactionResult represents a RLP encoded signed transaction.
type SignTransactionResult struct {
1796 1797
	Raw hexutil.Bytes      `json:"raw"`
	Tx  *types.Transaction `json:"tx"`
1798 1799 1800 1801 1802
}

// SignTransaction will sign the given transaction with the from account.
// The node needs to have the private key of the account corresponding with
// the given from address and it needs to be unlocked.
1803
func (s *TransactionAPI) SignTransaction(ctx context.Context, args TransactionArgs) (*SignTransactionResult, error) {
1804 1805 1806
	if args.Gas == nil {
		return nil, fmt.Errorf("gas not specified")
	}
1807 1808
	if args.GasPrice == nil && (args.MaxPriorityFeePerGas == nil || args.MaxFeePerGas == nil) {
		return nil, fmt.Errorf("missing gasPrice or maxFeePerGas/maxPriorityFeePerGas")
1809
	}
1810
	if args.Nonce == nil {
1811
		return nil, fmt.Errorf("nonce not specified")
1812
	}
1813 1814
	if err := args.setDefaults(ctx, s.b); err != nil {
		return nil, err
1815
	}
1816
	// Before actually sign the transaction, ensure the transaction fee is reasonable.
1817 1818
	tx := args.toTransaction()
	if err := checkTxFee(tx.GasPrice(), tx.Gas(), s.b.RPCTxFeeCap()); err != nil {
1819 1820
		return nil, err
	}
1821
	signed, err := s.sign(args.from(), tx)
1822 1823 1824
	if err != nil {
		return nil, err
	}
1825
	data, err := signed.MarshalBinary()
1826 1827 1828
	if err != nil {
		return nil, err
	}
1829
	return &SignTransactionResult{data, signed}, nil
1830 1831
}

1832 1833
// PendingTransactions returns the transactions that are in the transaction pool
// and have a from address that is one of the accounts this node manages.
1834
func (s *TransactionAPI) PendingTransactions() ([]*RPCTransaction, error) {
1835 1836 1837 1838
	pending, err := s.b.GetPoolTransactions()
	if err != nil {
		return nil, err
	}
1839 1840 1841 1842 1843 1844
	accounts := make(map[common.Address]struct{})
	for _, wallet := range s.b.AccountManager().Wallets() {
		for _, account := range wallet.Accounts() {
			accounts[account.Address] = struct{}{}
		}
	}
1845
	curHeader := s.b.CurrentHeader()
1846 1847
	transactions := make([]*RPCTransaction, 0, len(pending))
	for _, tx := range pending {
1848
		from, _ := types.Sender(s.signer, tx)
1849
		if _, exists := accounts[from]; exists {
1850
			transactions = append(transactions, newRPCPendingTransaction(tx, curHeader, s.b.ChainConfig()))
1851 1852
		}
	}
1853
	return transactions, nil
1854 1855
}

1856 1857
// Resend accepts an existing transaction and a new gas price and limit. It will remove
// the given transaction from the pool and reinsert it with the new gas price and limit.
1858
func (s *TransactionAPI) Resend(ctx context.Context, sendArgs TransactionArgs, gasPrice *hexutil.Big, gasLimit *hexutil.Uint64) (common.Hash, error) {
1859 1860 1861 1862 1863 1864 1865
	if sendArgs.Nonce == nil {
		return common.Hash{}, fmt.Errorf("missing transaction nonce in transaction spec")
	}
	if err := sendArgs.setDefaults(ctx, s.b); err != nil {
		return common.Hash{}, err
	}
	matchTx := sendArgs.toTransaction()
1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879

	// Before replacing the old transaction, ensure the _new_ transaction fee is reasonable.
	var price = matchTx.GasPrice()
	if gasPrice != nil {
		price = gasPrice.ToInt()
	}
	var gas = matchTx.Gas()
	if gasLimit != nil {
		gas = uint64(*gasLimit)
	}
	if err := checkTxFee(price, gas, s.b.RPCTxFeeCap()); err != nil {
		return common.Hash{}, err
	}
	// Iterate the pending list for replacement
1880 1881 1882 1883
	pending, err := s.b.GetPoolTransactions()
	if err != nil {
		return common.Hash{}, err
	}
1884
	for _, p := range pending {
1885 1886
		wantSigHash := s.signer.Hash(matchTx)
		pFrom, err := types.Sender(s.signer, p)
1887
		if err == nil && pFrom == sendArgs.from() && s.signer.Hash(p) == wantSigHash {
1888
			// Match. Re-sign and send the transaction.
1889
			if gasPrice != nil && (*big.Int)(gasPrice).Sign() != 0 {
1890
				sendArgs.GasPrice = gasPrice
1891
			}
1892
			if gasLimit != nil && *gasLimit != 0 {
1893
				sendArgs.Gas = gasLimit
1894
			}
1895
			signedTx, err := s.sign(sendArgs.from(), sendArgs.toTransaction())
1896 1897 1898 1899 1900 1901 1902 1903 1904
			if err != nil {
				return common.Hash{}, err
			}
			if err = s.b.SendTx(ctx, signedTx); err != nil {
				return common.Hash{}, err
			}
			return signedTx.Hash(), nil
		}
	}
1905
	return common.Hash{}, fmt.Errorf("transaction %#x not found", matchTx.Hash())
1906 1907
}

1908 1909 1910
// DebugAPI is the collection of Ethereum APIs exposed over the debugging
// namespace.
type DebugAPI struct {
1911 1912 1913
	b Backend
}

1914 1915 1916
// NewDebugAPI creates a new instance of DebugAPI.
func NewDebugAPI(b Backend) *DebugAPI {
	return &DebugAPI{b: b}
1917 1918
}

1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931
// GetRawHeader retrieves the RLP encoding for a single header.
func (api *DebugAPI) GetRawHeader(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (hexutil.Bytes, error) {
	var hash common.Hash
	if h, ok := blockNrOrHash.Hash(); ok {
		hash = h
	} else {
		block, err := api.b.BlockByNumberOrHash(ctx, blockNrOrHash)
		if err != nil {
			return nil, err
		}
		hash = block.Hash()
	}
	header, _ := api.b.HeaderByHash(ctx, hash)
1932
	if header == nil {
1933
		return nil, fmt.Errorf("header #%d not found", hash)
1934
	}
1935
	return rlp.EncodeToBytes(header)
1936 1937
}

1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950
// GetRawBlock retrieves the RLP encoded for a single block.
func (api *DebugAPI) GetRawBlock(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (hexutil.Bytes, error) {
	var hash common.Hash
	if h, ok := blockNrOrHash.Hash(); ok {
		hash = h
	} else {
		block, err := api.b.BlockByNumberOrHash(ctx, blockNrOrHash)
		if err != nil {
			return nil, err
		}
		hash = block.Hash()
	}
	block, _ := api.b.BlockByHash(ctx, hash)
1951
	if block == nil {
1952
		return nil, fmt.Errorf("block #%d not found", hash)
1953
	}
1954
	return rlp.EncodeToBytes(block)
1955 1956
}

1957
// GetRawReceipts retrieves the binary-encoded receipts of a single block.
1958
func (api *DebugAPI) GetRawReceipts(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) ([]hexutil.Bytes, error) {
1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983
	var hash common.Hash
	if h, ok := blockNrOrHash.Hash(); ok {
		hash = h
	} else {
		block, err := api.b.BlockByNumberOrHash(ctx, blockNrOrHash)
		if err != nil {
			return nil, err
		}
		hash = block.Hash()
	}
	receipts, err := api.b.GetReceipts(ctx, hash)
	if err != nil {
		return nil, err
	}
	result := make([]hexutil.Bytes, len(receipts))
	for i, receipt := range receipts {
		b, err := receipt.MarshalBinary()
		if err != nil {
			return nil, err
		}
		result[i] = b
	}
	return result, nil
}

1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999
// GetRawTransaction returns the bytes of the transaction for the given hash.
func (s *DebugAPI) GetRawTransaction(ctx context.Context, hash common.Hash) (hexutil.Bytes, error) {
	// Retrieve a finalized transaction, or a pooled otherwise
	tx, _, _, _, err := s.b.GetTransaction(ctx, hash)
	if err != nil {
		return nil, err
	}
	if tx == nil {
		if tx = s.b.GetPoolTransaction(hash); tx == nil {
			// Transaction not found anywhere, abort
			return nil, nil
		}
	}
	return tx.MarshalBinary()
}

2000
// PrintBlock retrieves a block and returns its pretty printed form.
2001
func (api *DebugAPI) PrintBlock(ctx context.Context, number uint64) (string, error) {
2002 2003 2004 2005
	block, _ := api.b.BlockByNumber(ctx, rpc.BlockNumber(number))
	if block == nil {
		return "", fmt.Errorf("block #%d not found", number)
	}
2006
	return spew.Sdump(block), nil
2007 2008 2009
}

// SeedHash retrieves the seed hash of a block.
2010
func (api *DebugAPI) SeedHash(ctx context.Context, number uint64) (string, error) {
2011 2012 2013 2014
	block, _ := api.b.BlockByNumber(ctx, rpc.BlockNumber(number))
	if block == nil {
		return "", fmt.Errorf("block #%d not found", number)
	}
2015
	return fmt.Sprintf("%#x", ethash.SeedHash(number)), nil
2016 2017
}

2018
// ChaindbProperty returns leveldb properties of the key-value database.
2019
func (api *DebugAPI) ChaindbProperty(property string) (string, error) {
2020 2021 2022 2023 2024
	if property == "" {
		property = "leveldb.stats"
	} else if !strings.HasPrefix(property, "leveldb.") {
		property = "leveldb." + property
	}
2025
	return api.b.ChainDb().Stat(property)
2026 2027
}

2028 2029
// ChaindbCompact flattens the entire key-value database into a single level,
// removing all unused slots and merging all keys.
2030
func (api *DebugAPI) ChaindbCompact() error {
2031
	for b := byte(0); b < 255; b++ {
2032
		log.Info("Compacting chain database", "range", fmt.Sprintf("0x%0.2X-0x%0.2X", b, b+1))
2033
		if err := api.b.ChainDb().Compact([]byte{b}, []byte{b + 1}); err != nil {
2034
			log.Error("Database compaction failed", "err", err)
2035 2036 2037 2038 2039 2040
			return err
		}
	}
	return nil
}

2041
// SetHead rewinds the head of the blockchain to a previous block.
2042
func (api *DebugAPI) SetHead(number hexutil.Uint64) {
2043
	api.b.SetHead(uint64(number))
2044 2045
}

2046 2047
// NetAPI offers network related RPC methods
type NetAPI struct {
2048 2049
	net            *p2p.Server
	networkVersion uint64
2050 2051
}

2052 2053 2054
// NewNetAPI creates a new net API instance.
func NewNetAPI(net *p2p.Server, networkVersion uint64) *NetAPI {
	return &NetAPI{net, networkVersion}
2055 2056 2057
}

// Listening returns an indication if the node is listening for network connections.
2058
func (s *NetAPI) Listening() bool {
2059 2060 2061 2062
	return true // always listening
}

// PeerCount returns the number of connected peers
2063
func (s *NetAPI) PeerCount() hexutil.Uint {
2064
	return hexutil.Uint(s.net.PeerCount())
2065 2066
}

2067
// Version returns the current ethereum protocol version.
2068
func (s *NetAPI) Version() string {
2069 2070 2071
	return fmt.Sprintf("%d", s.networkVersion)
}

2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085
// checkTxFee is an internal function used to check whether the fee of
// the given transaction is _reasonable_(under the cap).
func checkTxFee(gasPrice *big.Int, gas uint64, cap float64) error {
	// Short circuit if there is no cap for transaction fee at all.
	if cap == 0 {
		return nil
	}
	feeEth := new(big.Float).Quo(new(big.Float).SetInt(new(big.Int).Mul(gasPrice, new(big.Int).SetUint64(gas))), new(big.Float).SetInt(big.NewInt(params.Ether)))
	feeFloat, _ := feeEth.Float64()
	if feeFloat > cap {
		return fmt.Errorf("tx fee (%.2f ether) exceeds the configured cap (%.2f ether)", feeFloat, cap)
	}
	return nil
}
2086 2087 2088 2089 2090 2091 2092 2093 2094

// toHexSlice creates a slice of hex-strings based on []byte.
func toHexSlice(b [][]byte) []string {
	r := make([]string, len(b))
	for i := range b {
		r[i] = hexutil.Encode(b[i])
	}
	return r
}