mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 10:22:23 +00:00
Renaming, Adding tstore/tload support
This commit is contained in:
parent
9bb4fb0328
commit
fb55ee2446
9 changed files with 166 additions and 158 deletions
|
|
@ -136,7 +136,7 @@ func handleRip7560Transactions(transactions []*types.Transaction, index int, sta
|
|||
// todo: move to a suitable interface, whatever that is
|
||||
// todo 2: maybe handle the "shared gas pool" situation instead of just overriding it completely?
|
||||
func BuyGasRip7560Transaction(st *types.Rip7560AccountAbstractionTx, state vm.StateDB) error {
|
||||
gasLimit := st.Gas + st.ValidationGas + st.PaymasterGas + st.PostOpGas
|
||||
gasLimit := st.Gas + st.ValidationGasLimit + st.PaymasterValidationGasLimit + st.PostOpGas
|
||||
mgval := new(uint256.Int).SetUint64(gasLimit)
|
||||
gasFeeCap, _ := uint256.FromBig(st.GasFeeCap)
|
||||
mgval = mgval.Mul(mgval, gasFeeCap)
|
||||
|
|
@ -358,7 +358,7 @@ func prepareDeployerMessage(baseTx *types.Transaction, config *params.ChainConfi
|
|||
From: config.DeployerCallerAddress,
|
||||
To: tx.Deployer,
|
||||
Value: big.NewInt(0),
|
||||
GasLimit: tx.ValidationGas,
|
||||
GasLimit: tx.ValidationGasLimit,
|
||||
GasPrice: tx.GasFeeCap,
|
||||
GasFeeCap: tx.GasFeeCap,
|
||||
GasTipCap: tx.GasTipCap,
|
||||
|
|
@ -385,7 +385,7 @@ func prepareAccountValidationMessage(baseTx *types.Transaction, chainConfig *par
|
|||
From: chainConfig.EntryPointAddress,
|
||||
To: tx.Sender,
|
||||
Value: big.NewInt(0),
|
||||
GasLimit: tx.ValidationGas - deploymentUsedGas,
|
||||
GasLimit: tx.ValidationGasLimit - deploymentUsedGas,
|
||||
GasPrice: tx.GasFeeCap,
|
||||
GasFeeCap: tx.GasFeeCap,
|
||||
GasTipCap: tx.GasTipCap,
|
||||
|
|
@ -416,7 +416,7 @@ func preparePaymasterValidationMessage(baseTx *types.Transaction, config *params
|
|||
From: config.EntryPointAddress,
|
||||
To: tx.Paymaster,
|
||||
Value: big.NewInt(0),
|
||||
GasLimit: tx.PaymasterGas,
|
||||
GasLimit: tx.PaymasterValidationGasLimit,
|
||||
GasPrice: tx.GasFeeCap,
|
||||
GasFeeCap: tx.GasFeeCap,
|
||||
GasTipCap: tx.GasTipCap,
|
||||
|
|
@ -465,7 +465,7 @@ func preparePostOpMessage(vpr *ValidationPhaseResult, chainConfig *params.ChainC
|
|||
From: chainConfig.EntryPointAddress,
|
||||
To: tx.Paymaster,
|
||||
Value: big.NewInt(0),
|
||||
GasLimit: tx.PaymasterGas - executionResult.UsedGas,
|
||||
GasLimit: tx.PaymasterValidationGasLimit - executionResult.UsedGas,
|
||||
GasPrice: tx.GasFeeCap,
|
||||
GasFeeCap: tx.GasFeeCap,
|
||||
GasTipCap: tx.GasTipCap,
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ func (s rip7560Signer) Hash(tx *Transaction) common.Hash {
|
|||
aatx.PaymasterData,
|
||||
aatx.DeployerData,
|
||||
aatx.BuilderFee,
|
||||
aatx.ValidationGas,
|
||||
aatx.PaymasterGas,
|
||||
aatx.ValidationGasLimit,
|
||||
aatx.PaymasterValidationGasLimit,
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,16 +35,16 @@ type Rip7560AccountAbstractionTx struct {
|
|||
AccessList AccessList
|
||||
|
||||
// extra fields
|
||||
Sender *common.Address
|
||||
Signature []byte
|
||||
Paymaster *common.Address `rlp:"nil"`
|
||||
PaymasterData []byte
|
||||
Deployer *common.Address `rlp:"nil"`
|
||||
DeployerData []byte
|
||||
BuilderFee *big.Int
|
||||
ValidationGas uint64
|
||||
PaymasterGas uint64
|
||||
PostOpGas uint64
|
||||
Sender *common.Address
|
||||
Signature []byte
|
||||
Paymaster *common.Address `rlp:"nil"`
|
||||
PaymasterData []byte
|
||||
Deployer *common.Address `rlp:"nil"`
|
||||
DeployerData []byte
|
||||
BuilderFee *big.Int
|
||||
ValidationGasLimit uint64
|
||||
PaymasterValidationGasLimit uint64
|
||||
PostOpGas uint64
|
||||
|
||||
// removed fields
|
||||
To *common.Address `rlp:"nil"`
|
||||
|
|
@ -66,16 +66,16 @@ func (tx *Rip7560AccountAbstractionTx) copy() TxData {
|
|||
GasTipCap: new(big.Int),
|
||||
GasFeeCap: new(big.Int),
|
||||
|
||||
Sender: copyAddressPtr(tx.Sender),
|
||||
Signature: common.CopyBytes(tx.Signature),
|
||||
Paymaster: copyAddressPtr(tx.Paymaster),
|
||||
PaymasterData: common.CopyBytes(tx.PaymasterData),
|
||||
Deployer: copyAddressPtr(tx.Deployer),
|
||||
DeployerData: common.CopyBytes(tx.DeployerData),
|
||||
BuilderFee: new(big.Int),
|
||||
ValidationGas: tx.ValidationGas,
|
||||
PaymasterGas: tx.PaymasterGas,
|
||||
PostOpGas: tx.PostOpGas,
|
||||
Sender: copyAddressPtr(tx.Sender),
|
||||
Signature: common.CopyBytes(tx.Signature),
|
||||
Paymaster: copyAddressPtr(tx.Paymaster),
|
||||
PaymasterData: common.CopyBytes(tx.PaymasterData),
|
||||
Deployer: copyAddressPtr(tx.Deployer),
|
||||
DeployerData: common.CopyBytes(tx.DeployerData),
|
||||
BuilderFee: new(big.Int),
|
||||
ValidationGasLimit: tx.ValidationGasLimit,
|
||||
PaymasterValidationGasLimit: tx.PaymasterValidationGasLimit,
|
||||
PostOpGas: tx.PostOpGas,
|
||||
}
|
||||
copy(cpy.AccessList, tx.AccessList)
|
||||
if tx.Value != nil {
|
||||
|
|
@ -140,21 +140,21 @@ func (tx *Rip7560AccountAbstractionTx) decode(input []byte) error {
|
|||
|
||||
// Rip7560Transaction an equivalent of a solidity struct only used to encode the 'transaction' parameter
|
||||
type Rip7560Transaction struct {
|
||||
Sender common.Address
|
||||
Nonce *big.Int
|
||||
ValidationGasLimit *big.Int
|
||||
PaymasterGasLimit *big.Int
|
||||
PostOpGasLimit *big.Int
|
||||
CallGasLimit *big.Int
|
||||
MaxFeePerGas *big.Int
|
||||
MaxPriorityFeePerGas *big.Int
|
||||
BuilderFee *big.Int
|
||||
Paymaster *common.Address
|
||||
PaymasterData []byte
|
||||
Deployer *common.Address
|
||||
DeployerData []byte
|
||||
CallData []byte
|
||||
Signature []byte
|
||||
Sender common.Address
|
||||
Nonce *big.Int
|
||||
ValidationGasLimit *big.Int
|
||||
PaymasterValidationGasLimit *big.Int
|
||||
PostOpGasLimit *big.Int
|
||||
CallGasLimit *big.Int
|
||||
MaxFeePerGas *big.Int
|
||||
MaxPriorityFeePerGas *big.Int
|
||||
BuilderFee *big.Int
|
||||
Paymaster *common.Address
|
||||
PaymasterData []byte
|
||||
Deployer *common.Address
|
||||
DeployerData []byte
|
||||
CallData []byte
|
||||
Signature []byte
|
||||
}
|
||||
|
||||
func (tx *Rip7560AccountAbstractionTx) AbiEncode() ([]byte, error) {
|
||||
|
|
@ -162,7 +162,7 @@ func (tx *Rip7560AccountAbstractionTx) AbiEncode() ([]byte, error) {
|
|||
{Name: "sender", Type: "address"},
|
||||
{Name: "nonce", Type: "uint256"},
|
||||
{Name: "validationGasLimit", Type: "uint256"},
|
||||
{Name: "paymasterGasLimit", Type: "uint256"},
|
||||
{Name: "paymasterValidationGasLimit", Type: "uint256"},
|
||||
{Name: "callGasLimit", Type: "uint256"},
|
||||
{Name: "maxFeePerGas", Type: "uint256"},
|
||||
{Name: "maxPriorityFeePerGas", Type: "uint256"},
|
||||
|
|
@ -177,18 +177,18 @@ func (tx *Rip7560AccountAbstractionTx) AbiEncode() ([]byte, error) {
|
|||
{Type: structThing, Name: "param_one"},
|
||||
}
|
||||
record := &Rip7560Transaction{
|
||||
Sender: *tx.Sender,
|
||||
Nonce: big.NewInt(int64(tx.Nonce)),
|
||||
ValidationGasLimit: big.NewInt(int64(tx.ValidationGas)),
|
||||
PaymasterGasLimit: big.NewInt(int64(tx.PaymasterGas)),
|
||||
CallGasLimit: big.NewInt(int64(tx.Gas)),
|
||||
MaxFeePerGas: tx.GasFeeCap,
|
||||
MaxPriorityFeePerGas: tx.GasTipCap,
|
||||
BuilderFee: tx.BuilderFee,
|
||||
PaymasterData: tx.PaymasterData,
|
||||
DeployerData: tx.DeployerData,
|
||||
CallData: tx.Data,
|
||||
Signature: tx.Signature,
|
||||
Sender: *tx.Sender,
|
||||
Nonce: big.NewInt(int64(tx.Nonce)),
|
||||
ValidationGasLimit: big.NewInt(int64(tx.ValidationGasLimit)),
|
||||
PaymasterValidationGasLimit: big.NewInt(int64(tx.PaymasterValidationGasLimit)),
|
||||
CallGasLimit: big.NewInt(int64(tx.Gas)),
|
||||
MaxFeePerGas: tx.GasFeeCap,
|
||||
MaxPriorityFeePerGas: tx.GasTipCap,
|
||||
BuilderFee: tx.BuilderFee,
|
||||
PaymasterData: tx.PaymasterData,
|
||||
DeployerData: tx.DeployerData,
|
||||
CallData: tx.Data,
|
||||
Signature: tx.Signature,
|
||||
}
|
||||
packed, err := args.Pack(&record)
|
||||
return packed, err
|
||||
|
|
|
|||
|
|
@ -33,8 +33,10 @@ type contractSizeVal struct {
|
|||
}
|
||||
|
||||
type access struct {
|
||||
Reads map[string]string `json:"reads"`
|
||||
Writes map[string]uint64 `json:"writes"`
|
||||
Reads map[string]string `json:"reads"`
|
||||
Writes map[string]uint64 `json:"writes"`
|
||||
TransientReads map[string]uint64 `json:"transientReads"`
|
||||
TransientWrites map[string]uint64 `json:"transientWrites"`
|
||||
}
|
||||
|
||||
// note - this means an individual 'frame' in 7560 (validate, execute, postOp)
|
||||
|
|
@ -251,14 +253,16 @@ func (b *rip7560ValidationTracer) OnOpcode(pc uint64, op byte, gas, cost uint64,
|
|||
}
|
||||
b.lastOp = opcode
|
||||
|
||||
if opcode == "SLOAD" || opcode == "SSTORE" {
|
||||
if opcode == "SLOAD" || opcode == "SSTORE" || opcode == "TLOAD" || opcode == "TSTORE" {
|
||||
slot := common.BytesToHash(StackBack(scope.StackData(), 0).Bytes())
|
||||
slotHex := slot.Hex()
|
||||
addr := scope.Address()
|
||||
if _, ok := b.CurrentLevel.Access[addr]; !ok {
|
||||
b.CurrentLevel.Access[addr] = &access{
|
||||
Reads: map[string]string{},
|
||||
Writes: map[string]uint64{},
|
||||
Reads: map[string]string{},
|
||||
Writes: map[string]uint64{},
|
||||
TransientReads: map[string]uint64{},
|
||||
TransientWrites: map[string]uint64{},
|
||||
}
|
||||
}
|
||||
access := *b.CurrentLevel.Access[addr]
|
||||
|
|
@ -271,8 +275,12 @@ func (b *rip7560ValidationTracer) OnOpcode(pc uint64, op byte, gas, cost uint64,
|
|||
if !rOk && !wOk {
|
||||
access.Reads[slotHex] = b.env.StateDB.GetState(addr, slot).Hex()
|
||||
}
|
||||
} else {
|
||||
} else if opcode == "STORE" {
|
||||
b.incrementCount(access.Writes, slotHex)
|
||||
} else if opcode == "TLOAD" {
|
||||
b.incrementCount(access.TransientReads, slotHex)
|
||||
} else if opcode == "TSTORE" {
|
||||
b.incrementCount(access.TransientWrites, slotHex)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -500,16 +500,16 @@ func (args *TransactionArgs) ToTransaction() *types.Transaction {
|
|||
Data: args.data(),
|
||||
AccessList: al,
|
||||
// RIP-7560 parameters
|
||||
Sender: args.Sender,
|
||||
Signature: *args.Signature,
|
||||
Paymaster: args.Paymaster,
|
||||
PaymasterData: *args.PaymasterData,
|
||||
Deployer: args.Deployer,
|
||||
DeployerData: *args.DeployerData,
|
||||
BuilderFee: (*big.Int)(args.BuilderFee),
|
||||
ValidationGas: uint64(*args.ValidationGas),
|
||||
PaymasterGas: uint64(*args.PaymasterGas),
|
||||
PostOpGas: uint64(*args.PostOpGas),
|
||||
Sender: args.Sender,
|
||||
Signature: *args.Signature,
|
||||
Paymaster: args.Paymaster,
|
||||
PaymasterData: *args.PaymasterData,
|
||||
Deployer: args.Deployer,
|
||||
DeployerData: *args.DeployerData,
|
||||
BuilderFee: (*big.Int)(args.BuilderFee),
|
||||
ValidationGasLimit: uint64(*args.ValidationGas),
|
||||
PaymasterValidationGasLimit: uint64(*args.PaymasterGas),
|
||||
PostOpGas: uint64(*args.PostOpGas),
|
||||
}
|
||||
data = &aatx
|
||||
hash := types.NewTx(data).Hash()
|
||||
|
|
|
|||
|
|
@ -14,9 +14,9 @@ func TestValidationFailure_deployerRevert(t *testing.T) {
|
|||
withCode(DEFAULT_SENDER, []byte{}, DEFAULT_BALANCE).
|
||||
withCode(DEPLOYER.Hex(), revertWithData([]byte{}), 0),
|
||||
types.Rip7560AccountAbstractionTx{
|
||||
Deployer: &DEPLOYER,
|
||||
ValidationGas: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Deployer: &DEPLOYER,
|
||||
ValidationGasLimit: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "account deployment failed: execution reverted")
|
||||
}
|
||||
|
||||
|
|
@ -25,9 +25,9 @@ func TestValidationFailure_deployerOOG(t *testing.T) {
|
|||
withCode(DEFAULT_SENDER, []byte{}, DEFAULT_BALANCE).
|
||||
withCode(DEPLOYER.Hex(), revertWithData([]byte{}), 0),
|
||||
types.Rip7560AccountAbstractionTx{
|
||||
Deployer: &DEPLOYER,
|
||||
ValidationGas: 1,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Deployer: &DEPLOYER,
|
||||
ValidationGasLimit: 1,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "account deployment failed: out of gas")
|
||||
}
|
||||
|
||||
|
|
@ -36,9 +36,9 @@ func TestValidationFailure_senderNotDeployed(t *testing.T) {
|
|||
withCode(DEFAULT_SENDER, []byte{}, DEFAULT_BALANCE).
|
||||
withCode(DEPLOYER.Hex(), returnWithData([]byte{}), 0),
|
||||
types.Rip7560AccountAbstractionTx{
|
||||
Deployer: &DEPLOYER,
|
||||
ValidationGas: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Deployer: &DEPLOYER,
|
||||
ValidationGasLimit: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "account deployment failed: sender not deployed")
|
||||
}
|
||||
|
||||
|
|
@ -50,10 +50,10 @@ func TestValidationFailure_senderAlreadyDeployed(t *testing.T) {
|
|||
withCode(sender.Hex(), accountCode, DEFAULT_BALANCE).
|
||||
withCode(DEPLOYER.Hex(), deployerCode, 0),
|
||||
types.Rip7560AccountAbstractionTx{
|
||||
Sender: &sender,
|
||||
Deployer: &DEPLOYER,
|
||||
ValidationGas: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Sender: &sender,
|
||||
Deployer: &DEPLOYER,
|
||||
ValidationGasLimit: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "account deployment failed: sender already deployed")
|
||||
}
|
||||
|
||||
|
|
@ -65,10 +65,10 @@ func TestValidationFailure_senderReverts(t *testing.T) {
|
|||
withCode(sender.Hex(), []byte{}, DEFAULT_BALANCE).
|
||||
withCode(DEPLOYER.Hex(), deployerCode, 0),
|
||||
types.Rip7560AccountAbstractionTx{
|
||||
Sender: &sender,
|
||||
Deployer: &DEPLOYER,
|
||||
ValidationGas: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Sender: &sender,
|
||||
Deployer: &DEPLOYER,
|
||||
ValidationGasLimit: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "execution reverted")
|
||||
}
|
||||
|
||||
|
|
@ -80,9 +80,9 @@ func TestValidation_deployer_ok(t *testing.T) {
|
|||
withCode(sender.Hex(), []byte{}, DEFAULT_BALANCE).
|
||||
withCode(DEPLOYER.Hex(), deployerCode, 0),
|
||||
types.Rip7560AccountAbstractionTx{
|
||||
Sender: &sender,
|
||||
Deployer: &DEPLOYER,
|
||||
ValidationGas: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Sender: &sender,
|
||||
Deployer: &DEPLOYER,
|
||||
ValidationGasLimit: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "ok")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,9 +15,9 @@ func TestPaymasterValidationFailure_nobalance(t *testing.T) {
|
|||
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER, createAccountCode(), 0).
|
||||
withCode(DEFAULT_PAYMASTER.String(), createCode(vm.PUSH0, vm.DUP1, vm.REVERT), 1), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
ValidationGasLimit: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
}, "insufficient funds for gas * price + value: address 0xaaAaaAAAAAbBbbbbBbBBCCCCcCCCcCdddDDDdddd have 1 want 1000000000000000000")
|
||||
}
|
||||
|
||||
|
|
@ -25,19 +25,19 @@ func TestPaymasterValidationFailure_oog(t *testing.T) {
|
|||
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER, createAccountCode(), 0).
|
||||
withCode(DEFAULT_PAYMASTER.String(), createCode(vm.PUSH0, vm.DUP1, vm.REVERT), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
ValidationGasLimit: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
}, "out of gas")
|
||||
}
|
||||
func TestPaymasterValidationFailure_revert(t *testing.T) {
|
||||
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER, createAccountCode(), 0).
|
||||
withCode(DEFAULT_PAYMASTER.String(), createCode(vm.PUSH0, vm.DUP1, vm.REVERT), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
PaymasterGas: 1000000000,
|
||||
ValidationGasLimit: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
PaymasterValidationGasLimit: 1000000000,
|
||||
}, "execution reverted")
|
||||
}
|
||||
|
||||
|
|
@ -45,20 +45,20 @@ func TestPaymasterValidationFailure_unparseable_return_value(t *testing.T) {
|
|||
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER, createAccountCode(), 0).
|
||||
withCode(DEFAULT_PAYMASTER.String(), createAccountCode(), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: 1000000000,
|
||||
PaymasterGas: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
ValidationGasLimit: 1000000000,
|
||||
PaymasterValidationGasLimit: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
}, "paymaster return data: too short")
|
||||
}
|
||||
|
||||
func TestPaymasterValidationFailure_wrong_magic(t *testing.T) {
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER, createAccountCode(), 0).
|
||||
withCode(DEFAULT_PAYMASTER.String(), returnWithData(paymasterReturnValue(1, 2, 3, []byte{})), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: 1000000000,
|
||||
PaymasterGas: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
ValidationGasLimit: 1000000000,
|
||||
PaymasterValidationGasLimit: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
}, "paymaster did not return correct MAGIC_VALUE")
|
||||
}
|
||||
|
||||
|
|
@ -77,39 +77,39 @@ func TestPaymasterValidationFailure_contextTooLarge(t *testing.T) {
|
|||
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER, createAccountCode(), 0).
|
||||
withCode(DEFAULT_PAYMASTER.String(), pmCode, DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: 1000000000,
|
||||
PaymasterGas: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
ValidationGasLimit: 1000000000,
|
||||
PaymasterValidationGasLimit: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
}, "paymaster return data: context too large")
|
||||
}
|
||||
|
||||
func TestPaymasterValidationFailure_validAfter(t *testing.T) {
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER, createAccountCode(), 0).
|
||||
withCode(DEFAULT_PAYMASTER.String(), returnWithData(paymasterReturnValue(core.MAGIC_VALUE_PAYMASTER, 300, 200, []byte{})), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: 1000000000,
|
||||
PaymasterGas: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
ValidationGasLimit: 1000000000,
|
||||
PaymasterValidationGasLimit: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
}, "RIP-7560 transaction validity not reached yet")
|
||||
}
|
||||
|
||||
func TestPaymasterValidationFailure_validUntil(t *testing.T) {
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER, createAccountCode(), 0).
|
||||
withCode(DEFAULT_PAYMASTER.String(), returnWithData(paymasterReturnValue(core.MAGIC_VALUE_PAYMASTER, 1, 0, []byte{})), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: 1000000000,
|
||||
PaymasterGas: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
ValidationGasLimit: 1000000000,
|
||||
PaymasterValidationGasLimit: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
}, "RIP-7560 transaction validity expired")
|
||||
}
|
||||
|
||||
func TestPaymasterValidation_ok(t *testing.T) {
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER, createAccountCode(), 0).
|
||||
withCode(DEFAULT_PAYMASTER.String(), returnWithData(paymasterReturnValue(core.MAGIC_VALUE_PAYMASTER, 0, 0, []byte{})), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: 1000000000,
|
||||
PaymasterGas: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
ValidationGasLimit: 1000000000,
|
||||
PaymasterValidationGasLimit: 1000000000,
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Paymaster: &DEFAULT_PAYMASTER,
|
||||
}, "ok")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,10 +42,10 @@ func TestProcess1(t *testing.T) {
|
|||
withCode(DEFAULT_SENDER, createAccountCode(), 1000000000000000000).
|
||||
build(), []*types.Rip7560AccountAbstractionTx{
|
||||
{
|
||||
Sender: &Sender,
|
||||
ValidationGas: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Data: []byte{1, 2, 3},
|
||||
Sender: &Sender,
|
||||
ValidationGasLimit: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Data: []byte{1, 2, 3},
|
||||
},
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
|
|
|
|||
|
|
@ -30,23 +30,23 @@ func TestUnpackValidationData(t *testing.T) {
|
|||
func TestValidationFailure_OOG(t *testing.T) {
|
||||
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER, createAccountCode(), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: uint64(1),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
ValidationGasLimit: uint64(1),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "out of gas")
|
||||
}
|
||||
|
||||
func TestValidationFailure_no_balance(t *testing.T) {
|
||||
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER, createAccountCode(), 1), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: uint64(1),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
ValidationGasLimit: uint64(1),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "insufficient funds for gas * price + value: address 0x1111111111222222222233333333334444444444 have 1 want 1000000000")
|
||||
}
|
||||
|
||||
func TestValidationFailure_sigerror(t *testing.T) {
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER, returnWithData(core.PackValidationData(core.MAGIC_VALUE_SIGFAIL, 0, 0)), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
ValidationGasLimit: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "account signature error")
|
||||
}
|
||||
|
||||
|
|
@ -54,8 +54,8 @@ func TestValidationFailure_validAfter(t *testing.T) {
|
|||
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER,
|
||||
returnWithData(core.PackValidationData(core.MAGIC_VALUE_SENDER, 300, 200)), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
ValidationGasLimit: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "RIP-7560 transaction validity not reached yet")
|
||||
}
|
||||
|
||||
|
|
@ -63,45 +63,45 @@ func TestValidationFailure_validUntil(t *testing.T) {
|
|||
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER,
|
||||
returnWithData(core.PackValidationData(core.MAGIC_VALUE_SENDER, 1, 0)), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
ValidationGasLimit: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "RIP-7560 transaction validity expired")
|
||||
}
|
||||
|
||||
func TestValidation_ok(t *testing.T) {
|
||||
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER, createAccountCode(), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
ValidationGasLimit: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "ok")
|
||||
}
|
||||
|
||||
func TestValidation_ok_paid(t *testing.T) {
|
||||
|
||||
aatx := types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
ValidationGasLimit: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}
|
||||
tb := newTestContextBuilder(t).withCode(DEFAULT_SENDER, createAccountCode(), DEFAULT_BALANCE)
|
||||
handleTransaction(tb, aatx, "ok")
|
||||
|
||||
maxCost := new(big.Int).SetUint64(aatx.ValidationGas + aatx.PaymasterGas + aatx.Gas)
|
||||
maxCost := new(big.Int).SetUint64(aatx.ValidationGasLimit + aatx.PaymasterValidationGasLimit + aatx.Gas)
|
||||
maxCost.Mul(maxCost, aatx.GasFeeCap)
|
||||
}
|
||||
|
||||
func TestValidationFailure_account_nonce(t *testing.T) {
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER, createAccountCode(), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
Nonce: 1234,
|
||||
ValidationGas: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
Nonce: 1234,
|
||||
ValidationGasLimit: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "nonce too high: address 0x1111111111222222222233333333334444444444, tx: 1234 state: 0")
|
||||
}
|
||||
|
||||
func TestValidationFailure_account_revert(t *testing.T) {
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER,
|
||||
createCode(vm.PUSH0, vm.DUP1, vm.REVERT), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
ValidationGasLimit: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "execution reverted")
|
||||
}
|
||||
|
||||
|
|
@ -110,24 +110,24 @@ func TestValidationFailure_account_revert_with_reason(t *testing.T) {
|
|||
reason := hexutils.HexToBytes("0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000568656c6c6f000000000000000000000000000000000000000000000000000000")
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER,
|
||||
revertWithData(reason), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
ValidationGasLimit: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "execution reverted")
|
||||
}
|
||||
|
||||
func TestValidationFailure_account_wrong_return_length(t *testing.T) {
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER,
|
||||
returnWithData([]byte{1, 2, 3}), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
ValidationGasLimit: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "invalid account return data length")
|
||||
}
|
||||
|
||||
func TestValidationFailure_account_no_return_value(t *testing.T) {
|
||||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER,
|
||||
returnWithData([]byte{}), DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
ValidationGasLimit: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "invalid account return data length")
|
||||
}
|
||||
|
||||
|
|
@ -136,8 +136,8 @@ func TestValidationFailure_account_wrong_return_value(t *testing.T) {
|
|||
handleTransaction(newTestContextBuilder(t).withCode(DEFAULT_SENDER,
|
||||
returnWithData(make([]byte, 32)),
|
||||
DEFAULT_BALANCE), types.Rip7560AccountAbstractionTx{
|
||||
ValidationGas: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
ValidationGasLimit: uint64(1000000000),
|
||||
GasFeeCap: big.NewInt(1000000000),
|
||||
}, "account did not return correct MAGIC_VALUE")
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue