This commit is contained in:
colin 2025-02-18 21:08:47 +01:00 committed by GitHub
commit 4731c8a793
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 66 additions and 2 deletions

View File

@ -255,7 +255,8 @@ func TestStateProcessorErrors(t *testing.T) {
},
want: "could not apply tx 0 [0xc18d10f4c809dbdfa1a074c3300de9bc4b7f16a20f0ec667f6f67312b71b956a]: EIP-7702 transaction with empty auth list (sender 0x71562b71999873DB5b286dF957af199Ec94617F7)",
},
// ErrSetCodeTxCreate cannot be tested: it is impossible to create a SetCode-tx with nil `to`.
// ErrSetCodeTxCreate cannot be tested here: it is impossible to create a SetCode-tx with nil `to`.
// The EstimateGas API tests test this case.
} {
block := GenerateBadBlock(gspec.ToBlock(), beacon.New(ethash.NewFaker()), tt.txs, gspec.Config, false)
_, err := blockchain.InsertChain(types.Blocks{block})

View File

@ -2280,7 +2280,7 @@ func TestSetCodeTransactions(t *testing.T) {
t.Fatalf("%s: failed to add with remote setcode transaction: %v", name, err)
}
if err := pool.addRemoteSync(pricedTransaction(0, 100000, big.NewInt(1), keyC)); err != nil {
t.Fatalf("%s: failed to add with pending delegatio: %v", name, err)
t.Fatalf("%s: failed to add with pending delegation: %v", name, err)
}
// Also check gapped transaction is rejected.
if err := pool.addRemoteSync(pricedTransaction(1, 100000, big.NewInt(1), keyC)); !errors.Is(err, txpool.ErrAccountLimitExceeded) {

View File

@ -81,6 +81,11 @@ type ErrInvalidOpCode struct {
func (e *ErrInvalidOpCode) Error() string { return fmt.Sprintf("invalid opcode: %s", e.opcode) }
// NewErrInvalidOpCode is only used in tests to generate an exact ErrInvalidOpCode error.
func NewErrInvalidOpCode(opcode OpCode) *ErrInvalidOpCode {
return &ErrInvalidOpCode{opcode: opcode}
}
// rpcError is the same interface as the one defined in rpc/errors.go
// but we do not want to depend on rpc package here so we redefine it.
//

View File

@ -719,6 +719,9 @@ func toCallArg(msg ethereum.CallMsg) interface{} {
if msg.BlobHashes != nil {
arg["blobVersionedHashes"] = msg.BlobHashes
}
if msg.AuthList != nil {
arg["authorizationList"] = msg.AuthList
}
return arg
}

View File

@ -251,6 +251,9 @@ func toCallArg(msg ethereum.CallMsg) interface{} {
if msg.BlobHashes != nil {
arg["blobVersionedHashes"] = msg.BlobHashes
}
if msg.AuthList != nil {
arg["authorizationList"] = msg.AuthList
}
return arg
}

View File

@ -156,6 +156,9 @@ type CallMsg struct {
// For BlobTxType
BlobGasFeeCap *big.Int
BlobHashes []common.Hash
// For SetCodeTxType
AuthList []types.SetCodeAuthorization
}
// A ContractCaller provides contract calls, essentially transactions that are executed by

View File

@ -656,6 +656,11 @@ func TestEstimateGas(t *testing.T) {
b.SetPoS()
}))
setCodeAuthorization, _ := types.SignSetCode(accounts[0].key, types.SetCodeAuthorization{
Address: accounts[0].addr,
Nonce: uint64(genBlocks + 1),
})
var testSuite = []struct {
blockNumber rpc.BlockNumber
call TransactionArgs
@ -834,6 +839,50 @@ func TestEstimateGas(t *testing.T) {
},
want: 21000,
},
// Should be able to estimate SetCodeTx.
{
blockNumber: rpc.LatestBlockNumber,
call: TransactionArgs{
From: &accounts[0].addr,
To: &accounts[1].addr,
Value: (*hexutil.Big)(big.NewInt(0)),
AuthorizationList: []types.SetCodeAuthorization{setCodeAuthorization},
},
want: 46000,
},
// Should retrieve the code of 0xef0001 || accounts[0].addr and return an invalid opcode error.
{
blockNumber: rpc.LatestBlockNumber,
call: TransactionArgs{
From: &accounts[0].addr,
To: &accounts[0].addr,
Value: (*hexutil.Big)(big.NewInt(0)),
AuthorizationList: []types.SetCodeAuthorization{setCodeAuthorization},
},
expectErr: vm.NewErrInvalidOpCode(0xef),
},
// SetCodeTx with empty authorization list should fail.
{
blockNumber: rpc.LatestBlockNumber,
call: TransactionArgs{
From: &accounts[0].addr,
To: &common.Address{},
Value: (*hexutil.Big)(big.NewInt(0)),
AuthorizationList: []types.SetCodeAuthorization{},
},
expectErr: core.ErrEmptyAuthList,
},
// SetCodeTx with nil `to` should fail.
{
blockNumber: rpc.LatestBlockNumber,
call: TransactionArgs{
From: &accounts[0].addr,
To: nil,
Value: (*hexutil.Big)(big.NewInt(0)),
AuthorizationList: []types.SetCodeAuthorization{setCodeAuthorization},
},
expectErr: core.ErrSetCodeTxCreate,
},
}
for i, tc := range testSuite {
result, err := api.EstimateGas(context.Background(), tc.call, &rpc.BlockNumberOrHash{BlockNumber: &tc.blockNumber}, &tc.overrides, &tc.blockOverrides)