mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-10 15:04:27 +00:00
cmd/evm, core: fixes for eels tests@v20.0.0 release (#35283)
## Summary Sanity fixes surfaced by running the EELS `tests@v20.0.0` fixture release (63,109 blockchain tests) through `evm blocktest`. Also bumps CI to consume the new release: `build/checksums.txt` now points at `tests@v20.0.0` / `fixtures.tar.gz` from `ethereum/execution-specs` (supersedes the archived EEST repo's `fixtures_develop`). --------- Co-authored-by: Gary Rong <garyrong0905@gmail.com>
This commit is contained in:
parent
896a4ab7c6
commit
2ce0200762
8 changed files with 74 additions and 46 deletions
|
|
@ -1,9 +1,9 @@
|
||||||
# This file contains sha256 checksums of optional build dependencies.
|
# This file contains sha256 checksums of optional build dependencies.
|
||||||
|
|
||||||
# version:spec-tests v5.1.0
|
# version:spec-tests tests@v20.0.0
|
||||||
# https://github.com/ethereum/execution-spec-tests/releases
|
# https://github.com/ethereum/execution-specs/releases
|
||||||
# https://github.com/ethereum/execution-spec-tests/releases/download/v5.1.0
|
# https://github.com/ethereum/execution-specs/releases/download/tests%40v20.0.0
|
||||||
a3192784375acec7eaec492799d5c5d0c47a2909a3cc40178898e4ecd20cc416 fixtures_develop.tar.gz
|
b183702a5b447b465873865357ced9eb342315922e52e31b714e2de115dd0bb4 fixtures.tar.gz
|
||||||
|
|
||||||
# version:golang 1.25.10
|
# version:golang 1.25.10
|
||||||
# https://go.dev/dl/
|
# https://go.dev/dl/
|
||||||
|
|
|
||||||
|
|
@ -452,7 +452,7 @@ func doTest(cmdline []string) {
|
||||||
// downloadSpecTestFixtures downloads and extracts the execution-spec-tests fixtures.
|
// downloadSpecTestFixtures downloads and extracts the execution-spec-tests fixtures.
|
||||||
func downloadSpecTestFixtures(csdb *download.ChecksumDB, cachedir string) string {
|
func downloadSpecTestFixtures(csdb *download.ChecksumDB, cachedir string) string {
|
||||||
ext := ".tar.gz"
|
ext := ".tar.gz"
|
||||||
base := "fixtures_develop"
|
base := "fixtures"
|
||||||
archivePath := filepath.Join(cachedir, base+ext)
|
archivePath := filepath.Join(cachedir, base+ext)
|
||||||
if err := csdb.DownloadFileFromKnownURL(archivePath); err != nil {
|
if err := csdb.DownloadFileFromKnownURL(archivePath); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
|
|
||||||
|
|
@ -88,14 +88,13 @@ func TestExecutionSpecBlocktests(t *testing.T) {
|
||||||
bt := new(testMatcher)
|
bt := new(testMatcher)
|
||||||
|
|
||||||
// These tests require us to handle scenarios where a system contract is not deployed at a fork
|
// These tests require us to handle scenarios where a system contract is not deployed at a fork
|
||||||
bt.skipLoad(".*prague/eip7251_consolidations/test_system_contract_deployment.json")
|
bt.skipLoad(`.*eip7251_consolidations/contract_deployment/system_contract_deployment\.json`)
|
||||||
bt.skipLoad(".*prague/eip7002_el_triggerable_withdrawals/test_system_contract_deployment.json")
|
bt.skipLoad(`.*eip7002_el_triggerable_withdrawals/contract_deployment/system_contract_deployment\.json`)
|
||||||
|
|
||||||
// Broken tests
|
// Broken tests
|
||||||
bt.skipLoad(`RevertInCreateInInit`)
|
bt.skipLoad(`.*eip7610_create_collision/initcollision/.*`)
|
||||||
bt.skipLoad(`InitCollisionParis`)
|
bt.skipLoad(`.*eip7610_create_collision/revert_in_create/.*`)
|
||||||
bt.skipLoad(`dynamicAccountOverwriteEmpty_Paris`)
|
bt.skipLoad(`.*stRandom2/random_statetest642/.*`)
|
||||||
bt.skipLoad(`create2collisionStorageParis`)
|
|
||||||
|
|
||||||
bt.walk(t, executionSpecBlockchainTestDir, func(t *testing.T, name string, test *BlockTest) {
|
bt.walk(t, executionSpecBlockchainTestDir, func(t *testing.T, name string, test *BlockTest) {
|
||||||
execBlockTest(t, bt, test)
|
execBlockTest(t, bt, test)
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ func (s stEnv) MarshalJSON() ([]byte, error) {
|
||||||
Timestamp math.HexOrDecimal64 `json:"currentTimestamp" gencodec:"required"`
|
Timestamp math.HexOrDecimal64 `json:"currentTimestamp" gencodec:"required"`
|
||||||
BaseFee *math.HexOrDecimal256 `json:"currentBaseFee" gencodec:"optional"`
|
BaseFee *math.HexOrDecimal256 `json:"currentBaseFee" gencodec:"optional"`
|
||||||
ExcessBlobGas *math.HexOrDecimal64 `json:"currentExcessBlobGas" gencodec:"optional"`
|
ExcessBlobGas *math.HexOrDecimal64 `json:"currentExcessBlobGas" gencodec:"optional"`
|
||||||
|
SlotNumber *math.HexOrDecimal64 `json:"slotNumber" gencodec:"optional"`
|
||||||
}
|
}
|
||||||
var enc stEnv
|
var enc stEnv
|
||||||
enc.Coinbase = common.UnprefixedAddress(s.Coinbase)
|
enc.Coinbase = common.UnprefixedAddress(s.Coinbase)
|
||||||
|
|
@ -34,6 +35,7 @@ func (s stEnv) MarshalJSON() ([]byte, error) {
|
||||||
enc.Timestamp = math.HexOrDecimal64(s.Timestamp)
|
enc.Timestamp = math.HexOrDecimal64(s.Timestamp)
|
||||||
enc.BaseFee = (*math.HexOrDecimal256)(s.BaseFee)
|
enc.BaseFee = (*math.HexOrDecimal256)(s.BaseFee)
|
||||||
enc.ExcessBlobGas = (*math.HexOrDecimal64)(s.ExcessBlobGas)
|
enc.ExcessBlobGas = (*math.HexOrDecimal64)(s.ExcessBlobGas)
|
||||||
|
enc.SlotNumber = (*math.HexOrDecimal64)(s.SlotNumber)
|
||||||
return json.Marshal(&enc)
|
return json.Marshal(&enc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -48,6 +50,7 @@ func (s *stEnv) UnmarshalJSON(input []byte) error {
|
||||||
Timestamp *math.HexOrDecimal64 `json:"currentTimestamp" gencodec:"required"`
|
Timestamp *math.HexOrDecimal64 `json:"currentTimestamp" gencodec:"required"`
|
||||||
BaseFee *math.HexOrDecimal256 `json:"currentBaseFee" gencodec:"optional"`
|
BaseFee *math.HexOrDecimal256 `json:"currentBaseFee" gencodec:"optional"`
|
||||||
ExcessBlobGas *math.HexOrDecimal64 `json:"currentExcessBlobGas" gencodec:"optional"`
|
ExcessBlobGas *math.HexOrDecimal64 `json:"currentExcessBlobGas" gencodec:"optional"`
|
||||||
|
SlotNumber *math.HexOrDecimal64 `json:"slotNumber" gencodec:"optional"`
|
||||||
}
|
}
|
||||||
var dec stEnv
|
var dec stEnv
|
||||||
if err := json.Unmarshal(input, &dec); err != nil {
|
if err := json.Unmarshal(input, &dec); err != nil {
|
||||||
|
|
@ -81,5 +84,8 @@ func (s *stEnv) UnmarshalJSON(input []byte) error {
|
||||||
if dec.ExcessBlobGas != nil {
|
if dec.ExcessBlobGas != nil {
|
||||||
s.ExcessBlobGas = (*uint64)(dec.ExcessBlobGas)
|
s.ExcessBlobGas = (*uint64)(dec.ExcessBlobGas)
|
||||||
}
|
}
|
||||||
|
if dec.SlotNumber != nil {
|
||||||
|
s.SlotNumber = (*uint64)(dec.SlotNumber)
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -487,7 +487,7 @@ var Forks = map[string]*params.ChainConfig{
|
||||||
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
||||||
Cancun: params.DefaultCancunBlobConfig,
|
Cancun: params.DefaultCancunBlobConfig,
|
||||||
Prague: params.DefaultPragueBlobConfig,
|
Prague: params.DefaultPragueBlobConfig,
|
||||||
BPO1: bpo1BlobConfig,
|
BPO1: params.DefaultBPO1BlobConfig,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"OsakaToBPO1AtTime15k": {
|
"OsakaToBPO1AtTime15k": {
|
||||||
|
|
@ -515,7 +515,7 @@ var Forks = map[string]*params.ChainConfig{
|
||||||
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
||||||
Cancun: params.DefaultCancunBlobConfig,
|
Cancun: params.DefaultCancunBlobConfig,
|
||||||
Prague: params.DefaultPragueBlobConfig,
|
Prague: params.DefaultPragueBlobConfig,
|
||||||
BPO1: bpo1BlobConfig,
|
BPO1: params.DefaultBPO1BlobConfig,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"BPO2": {
|
"BPO2": {
|
||||||
|
|
@ -544,8 +544,8 @@ var Forks = map[string]*params.ChainConfig{
|
||||||
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
||||||
Cancun: params.DefaultCancunBlobConfig,
|
Cancun: params.DefaultCancunBlobConfig,
|
||||||
Prague: params.DefaultPragueBlobConfig,
|
Prague: params.DefaultPragueBlobConfig,
|
||||||
BPO1: bpo1BlobConfig,
|
BPO1: params.DefaultBPO1BlobConfig,
|
||||||
BPO2: bpo2BlobConfig,
|
BPO2: params.DefaultBPO2BlobConfig,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"BPO1ToBPO2AtTime15k": {
|
"BPO1ToBPO2AtTime15k": {
|
||||||
|
|
@ -574,8 +574,8 @@ var Forks = map[string]*params.ChainConfig{
|
||||||
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
||||||
Cancun: params.DefaultCancunBlobConfig,
|
Cancun: params.DefaultCancunBlobConfig,
|
||||||
Prague: params.DefaultPragueBlobConfig,
|
Prague: params.DefaultPragueBlobConfig,
|
||||||
BPO1: bpo1BlobConfig,
|
BPO1: params.DefaultBPO1BlobConfig,
|
||||||
BPO2: bpo2BlobConfig,
|
BPO2: params.DefaultBPO2BlobConfig,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"BPO3": {
|
"BPO3": {
|
||||||
|
|
@ -605,8 +605,8 @@ var Forks = map[string]*params.ChainConfig{
|
||||||
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
||||||
Cancun: params.DefaultCancunBlobConfig,
|
Cancun: params.DefaultCancunBlobConfig,
|
||||||
Prague: params.DefaultPragueBlobConfig,
|
Prague: params.DefaultPragueBlobConfig,
|
||||||
BPO1: bpo1BlobConfig,
|
BPO1: params.DefaultBPO1BlobConfig,
|
||||||
BPO2: bpo2BlobConfig,
|
BPO2: params.DefaultBPO2BlobConfig,
|
||||||
BPO3: params.DefaultBPO3BlobConfig,
|
BPO3: params.DefaultBPO3BlobConfig,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -637,8 +637,8 @@ var Forks = map[string]*params.ChainConfig{
|
||||||
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
||||||
Cancun: params.DefaultCancunBlobConfig,
|
Cancun: params.DefaultCancunBlobConfig,
|
||||||
Prague: params.DefaultPragueBlobConfig,
|
Prague: params.DefaultPragueBlobConfig,
|
||||||
BPO1: bpo1BlobConfig,
|
BPO1: params.DefaultBPO1BlobConfig,
|
||||||
BPO2: bpo2BlobConfig,
|
BPO2: params.DefaultBPO2BlobConfig,
|
||||||
BPO3: params.DefaultBPO3BlobConfig,
|
BPO3: params.DefaultBPO3BlobConfig,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -670,8 +670,8 @@ var Forks = map[string]*params.ChainConfig{
|
||||||
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
||||||
Cancun: params.DefaultCancunBlobConfig,
|
Cancun: params.DefaultCancunBlobConfig,
|
||||||
Prague: params.DefaultPragueBlobConfig,
|
Prague: params.DefaultPragueBlobConfig,
|
||||||
BPO1: bpo1BlobConfig,
|
BPO1: params.DefaultBPO1BlobConfig,
|
||||||
BPO2: bpo2BlobConfig,
|
BPO2: params.DefaultBPO2BlobConfig,
|
||||||
BPO3: params.DefaultBPO3BlobConfig,
|
BPO3: params.DefaultBPO3BlobConfig,
|
||||||
BPO4: params.DefaultBPO4BlobConfig,
|
BPO4: params.DefaultBPO4BlobConfig,
|
||||||
},
|
},
|
||||||
|
|
@ -704,8 +704,8 @@ var Forks = map[string]*params.ChainConfig{
|
||||||
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
||||||
Cancun: params.DefaultCancunBlobConfig,
|
Cancun: params.DefaultCancunBlobConfig,
|
||||||
Prague: params.DefaultPragueBlobConfig,
|
Prague: params.DefaultPragueBlobConfig,
|
||||||
BPO1: bpo1BlobConfig,
|
BPO1: params.DefaultBPO1BlobConfig,
|
||||||
BPO2: bpo2BlobConfig,
|
BPO2: params.DefaultBPO2BlobConfig,
|
||||||
BPO3: params.DefaultBPO3BlobConfig,
|
BPO3: params.DefaultBPO3BlobConfig,
|
||||||
BPO4: params.DefaultBPO4BlobConfig,
|
BPO4: params.DefaultBPO4BlobConfig,
|
||||||
},
|
},
|
||||||
|
|
@ -732,17 +732,44 @@ var Forks = map[string]*params.ChainConfig{
|
||||||
OsakaTime: u64(0),
|
OsakaTime: u64(0),
|
||||||
BPO1Time: u64(0),
|
BPO1Time: u64(0),
|
||||||
BPO2Time: u64(0),
|
BPO2Time: u64(0),
|
||||||
BPO3Time: u64(0),
|
|
||||||
BPO4Time: u64(0),
|
|
||||||
AmsterdamTime: u64(0),
|
AmsterdamTime: u64(0),
|
||||||
DepositContractAddress: params.MainnetChainConfig.DepositContractAddress,
|
DepositContractAddress: params.MainnetChainConfig.DepositContractAddress,
|
||||||
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
||||||
Cancun: params.DefaultCancunBlobConfig,
|
Cancun: params.DefaultCancunBlobConfig,
|
||||||
Prague: params.DefaultPragueBlobConfig,
|
Prague: params.DefaultPragueBlobConfig,
|
||||||
BPO1: bpo1BlobConfig,
|
BPO1: params.DefaultBPO1BlobConfig,
|
||||||
BPO2: bpo2BlobConfig,
|
BPO2: params.DefaultBPO2BlobConfig,
|
||||||
BPO3: params.DefaultBPO3BlobConfig,
|
},
|
||||||
BPO4: params.DefaultBPO4BlobConfig,
|
},
|
||||||
|
"BPO2ToAmsterdamAtTime15k": {
|
||||||
|
ChainID: big.NewInt(1),
|
||||||
|
HomesteadBlock: big.NewInt(0),
|
||||||
|
EIP150Block: big.NewInt(0),
|
||||||
|
EIP155Block: big.NewInt(0),
|
||||||
|
EIP158Block: big.NewInt(0),
|
||||||
|
ByzantiumBlock: big.NewInt(0),
|
||||||
|
ConstantinopleBlock: big.NewInt(0),
|
||||||
|
PetersburgBlock: big.NewInt(0),
|
||||||
|
IstanbulBlock: big.NewInt(0),
|
||||||
|
MuirGlacierBlock: big.NewInt(0),
|
||||||
|
BerlinBlock: big.NewInt(0),
|
||||||
|
LondonBlock: big.NewInt(0),
|
||||||
|
ArrowGlacierBlock: big.NewInt(0),
|
||||||
|
MergeNetsplitBlock: big.NewInt(0),
|
||||||
|
TerminalTotalDifficulty: big.NewInt(0),
|
||||||
|
ShanghaiTime: u64(0),
|
||||||
|
CancunTime: u64(0),
|
||||||
|
PragueTime: u64(0),
|
||||||
|
OsakaTime: u64(0),
|
||||||
|
BPO1Time: u64(0),
|
||||||
|
BPO2Time: u64(0),
|
||||||
|
AmsterdamTime: u64(15_000),
|
||||||
|
DepositContractAddress: params.MainnetChainConfig.DepositContractAddress,
|
||||||
|
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
||||||
|
Cancun: params.DefaultCancunBlobConfig,
|
||||||
|
Prague: params.DefaultPragueBlobConfig,
|
||||||
|
BPO1: params.DefaultBPO1BlobConfig,
|
||||||
|
BPO2: params.DefaultBPO2BlobConfig,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"Verkle": {
|
"Verkle": {
|
||||||
|
|
@ -793,16 +820,11 @@ var Forks = map[string]*params.ChainConfig{
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var bpo1BlobConfig = ¶ms.BlobConfig{
|
func init() {
|
||||||
Target: 9,
|
// Execution-spec-tests fixtures use the historical upgrade names for
|
||||||
Max: 14,
|
// the EIP150 and EIP158 rulesets.
|
||||||
UpdateFraction: 8832827,
|
Forks["TangerineWhistle"] = Forks["EIP150"]
|
||||||
}
|
Forks["SpuriousDragon"] = Forks["EIP158"]
|
||||||
|
|
||||||
var bpo2BlobConfig = ¶ms.BlobConfig{
|
|
||||||
Target: 14,
|
|
||||||
Max: 21,
|
|
||||||
UpdateFraction: 13739630,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AvailableForks returns the set of defined fork names
|
// AvailableForks returns the set of defined fork names
|
||||||
|
|
|
||||||
|
|
@ -97,10 +97,8 @@ func TestExecutionSpecState(t *testing.T) {
|
||||||
st := new(testMatcher)
|
st := new(testMatcher)
|
||||||
|
|
||||||
// Broken tests
|
// Broken tests
|
||||||
st.skipLoad(`RevertInCreateInInit`)
|
st.skipLoad(`.*eip7610_create_collision/initcollision/.*`)
|
||||||
st.skipLoad(`InitCollisionParis`)
|
st.skipLoad(`.*eip7610_create_collision/revert_in_create/.*`)
|
||||||
st.skipLoad(`dynamicAccountOverwriteEmpty_Paris`)
|
|
||||||
st.skipLoad(`create2collisionStorageParis`)
|
|
||||||
|
|
||||||
st.walk(t, executionSpecStateTestDir, func(t *testing.T, name string, test *StateTest) {
|
st.walk(t, executionSpecStateTestDir, func(t *testing.T, name string, test *StateTest) {
|
||||||
execStateTest(t, st, test)
|
execStateTest(t, st, test)
|
||||||
|
|
|
||||||
|
|
@ -95,6 +95,7 @@ type stEnv struct {
|
||||||
Timestamp uint64 `json:"currentTimestamp" gencodec:"required"`
|
Timestamp uint64 `json:"currentTimestamp" gencodec:"required"`
|
||||||
BaseFee *big.Int `json:"currentBaseFee" gencodec:"optional"`
|
BaseFee *big.Int `json:"currentBaseFee" gencodec:"optional"`
|
||||||
ExcessBlobGas *uint64 `json:"currentExcessBlobGas" gencodec:"optional"`
|
ExcessBlobGas *uint64 `json:"currentExcessBlobGas" gencodec:"optional"`
|
||||||
|
SlotNumber *uint64 `json:"slotNumber" gencodec:"optional"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type stEnvMarshaling struct {
|
type stEnvMarshaling struct {
|
||||||
|
|
@ -106,6 +107,7 @@ type stEnvMarshaling struct {
|
||||||
Timestamp math.HexOrDecimal64
|
Timestamp math.HexOrDecimal64
|
||||||
BaseFee *math.HexOrDecimal256
|
BaseFee *math.HexOrDecimal256
|
||||||
ExcessBlobGas *math.HexOrDecimal64
|
ExcessBlobGas *math.HexOrDecimal64
|
||||||
|
SlotNumber *math.HexOrDecimal64
|
||||||
}
|
}
|
||||||
|
|
||||||
//go:generate go run github.com/fjl/gencodec -type stTransaction -field-override stTransactionMarshaling -out gen_sttransaction.go
|
//go:generate go run github.com/fjl/gencodec -type stTransaction -field-override stTransactionMarshaling -out gen_sttransaction.go
|
||||||
|
|
@ -378,6 +380,7 @@ func (t *StateTest) genesis(config *params.ChainConfig) *core.Genesis {
|
||||||
GasLimit: t.json.Env.GasLimit,
|
GasLimit: t.json.Env.GasLimit,
|
||||||
Number: t.json.Env.Number,
|
Number: t.json.Env.Number,
|
||||||
Timestamp: t.json.Env.Timestamp,
|
Timestamp: t.json.Env.Timestamp,
|
||||||
|
SlotNumber: t.json.Env.SlotNumber,
|
||||||
Alloc: t.json.Pre,
|
Alloc: t.json.Pre,
|
||||||
}
|
}
|
||||||
if t.json.Env.Random != nil {
|
if t.json.Env.Random != nil {
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,7 @@ func TestExecutionSpecTransaction(t *testing.T) {
|
||||||
st := new(testMatcher)
|
st := new(testMatcher)
|
||||||
|
|
||||||
// Emptiness of authorization list is only validated during the tx precheck
|
// Emptiness of authorization list is only validated during the tx precheck
|
||||||
st.skipLoad("^prague/eip7702_set_code_tx/test_empty_authorization_list.json")
|
st.skipLoad(`eip7702_set_code_tx/invalid_tx/empty_authorization_list\.json`)
|
||||||
|
|
||||||
st.walk(t, executionSpecTransactionTestDir, func(t *testing.T, name string, test *TransactionTest) {
|
st.walk(t, executionSpecTransactionTestDir, func(t *testing.T, name string, test *TransactionTest) {
|
||||||
if err := st.checkFailure(t, test.Run()); err != nil {
|
if err := st.checkFailure(t, test.Run()); err != nil {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue