Skip to content

Commit 81baa03

Browse files
MariusVanDerWijdens1na
authored andcommitted
core: implement eip-7623
Co-authored-by: Marius van der Wijden <[email protected]> Co-authored-by: Sina Mahmoodi <[email protected]> return floor gas instead of tokens apply floor after refunds fix tests fix gas return amount fix tests
1 parent 82e963e commit 81baa03

17 files changed

+119
-73
lines changed

cmd/evm/internal/t8ntool/transaction.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ func Transaction(ctx *cli.Context) error {
133133
r.Address = sender
134134
}
135135
// Check intrinsic gas
136-
if gas, err := core.IntrinsicGas(tx.Data(), tx.AccessList(), tx.SetCodeAuthorizations(), tx.To() == nil,
136+
if gas, _, err := core.IntrinsicGas(tx.Data(), tx.AccessList(), tx.SetCodeAuthorizations(), tx.To() == nil,
137137
chainConfig.IsHomestead(new(big.Int)), chainConfig.IsIstanbul(new(big.Int)), chainConfig.IsShanghai(new(big.Int), 0)); err != nil {
138138
r.Error = err
139139
results = append(results, r)

core/bench_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func genValueTx(nbytes int) func(int, *BlockGen) {
9090
data := make([]byte, nbytes)
9191
return func(i int, gen *BlockGen) {
9292
toaddr := common.Address{}
93-
gas, _ := IntrinsicGas(data, nil, nil, false, false, false, false)
93+
gas, _, _ := IntrinsicGas(data, nil, nil, false, false, false, false)
9494
signer := gen.Signer()
9595
gasPrice := big.NewInt(0)
9696
if gen.header.BaseFee != nil {

core/error.go

+4
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ var (
8080
// than required to start the invocation.
8181
ErrIntrinsicGas = errors.New("intrinsic gas too low")
8282

83+
// ErrDataFloorGas is returned if the transaction is specified to use less gas
84+
// than required for the data floor cost.
85+
ErrDataFloorGas = errors.New("insufficient gas for data floor cost")
86+
8387
// ErrTxTypeNotSupported is returned if a transaction is not supported in the
8488
// current network configuration.
8589
ErrTxTypeNotSupported = types.ErrTxTypeNotSupported

core/state_processor_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,9 @@ func TestStateProcessorErrors(t *testing.T) {
251251
},
252252
{ // ErrMaxInitCodeSizeExceeded
253253
txs: []*types.Transaction{
254-
mkDynamicCreationTx(0, 500000, common.Big0, big.NewInt(params.InitialBaseFee), tooBigInitCode[:]),
254+
mkDynamicCreationTx(0, 520000, common.Big0, big.NewInt(params.InitialBaseFee), tooBigInitCode[:]),
255255
},
256-
want: "could not apply tx 0 [0xd491405f06c92d118dd3208376fcee18a57c54bc52063ee4a26b1cf296857c25]: max initcode size exceeded: code size 49153 limit 49152",
256+
want: "could not apply tx 0 [0x3a30404d42d6ccc843d7c391fd0c87b9b9795a0c174261b46d2ac95ca17b81cd]: max initcode size exceeded: code size 49153 limit 49152",
257257
},
258258
{ // ErrIntrinsicGas: Not enough gas to cover init code
259259
txs: []*types.Transaction{

core/state_transition.go

+52-20
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,14 @@ func (result *ExecutionResult) Revert() []byte {
6666
return common.CopyBytes(result.ReturnData)
6767
}
6868

69-
// IntrinsicGas computes the 'intrinsic gas' for a message with the given data.
70-
func IntrinsicGas(data []byte, accessList types.AccessList, authList []types.SetCodeAuthorization, isContractCreation, isHomestead, isEIP2028, isEIP3860 bool) (uint64, error) {
69+
// IntrinsicGas computes the 'intrinsic gas' and the number of tokens for EIP-7623
70+
// for a message with the given data.
71+
func IntrinsicGas(data []byte, accessList types.AccessList, authList []types.SetCodeAuthorization, isContractCreation, isHomestead, isEIP2028, isEIP3860 bool) (uint64, uint64, error) {
7172
// Set the starting gas for the raw transaction
72-
var gas uint64
73+
var (
74+
gas uint64
75+
floorDataGas uint64
76+
)
7377
if isContractCreation && isHomestead {
7478
gas = params.TxGasContractCreation
7579
} else {
@@ -85,26 +89,36 @@ func IntrinsicGas(data []byte, accessList types.AccessList, authList []types.Set
8589
nz++
8690
}
8791
}
92+
var (
93+
z = dataLen - nz
94+
tokens = nz*params.TokenPerNonZeroByte7623 + z
95+
)
96+
// Check for overflow
97+
if (math.MaxUint64-params.TxGas)/params.CostFloorPerToken7623 < tokens {
98+
return 0, 0, ErrGasUintOverflow
99+
}
100+
// Minimum gas required for a transaction based on its data tokens (EIP-7623).
101+
floorDataGas = params.TxGas + tokens*params.CostFloorPerToken7623
102+
88103
// Make sure we don't exceed uint64 for all data combinations
89104
nonZeroGas := params.TxDataNonZeroGasFrontier
90105
if isEIP2028 {
91106
nonZeroGas = params.TxDataNonZeroGasEIP2028
92107
}
93108
if (math.MaxUint64-gas)/nonZeroGas < nz {
94-
return 0, ErrGasUintOverflow
109+
return 0, 0, ErrGasUintOverflow
95110
}
96111
gas += nz * nonZeroGas
97112

98-
z := dataLen - nz
99113
if (math.MaxUint64-gas)/params.TxDataZeroGas < z {
100-
return 0, ErrGasUintOverflow
114+
return 0, 0, ErrGasUintOverflow
101115
}
102116
gas += z * params.TxDataZeroGas
103117

104118
if isContractCreation && isEIP3860 {
105119
lenWords := toWordSize(dataLen)
106120
if (math.MaxUint64-gas)/params.InitCodeWordGas < lenWords {
107-
return 0, ErrGasUintOverflow
121+
return 0, 0, ErrGasUintOverflow
108122
}
109123
gas += lenWords * params.InitCodeWordGas
110124
}
@@ -116,7 +130,7 @@ func IntrinsicGas(data []byte, accessList types.AccessList, authList []types.Set
116130
if authList != nil {
117131
gas += uint64(len(authList)) * params.CallNewAccountGas
118132
}
119-
return gas, nil
133+
return gas, floorDataGas, nil
120134
}
121135

122136
// toWordSize returns the ceiled word size required for init code payment calculation.
@@ -417,13 +431,19 @@ func (st *stateTransition) execute() (*ExecutionResult, error) {
417431
)
418432

419433
// Check clauses 4-5, subtract intrinsic gas if everything is correct
420-
gas, err := IntrinsicGas(msg.Data, msg.AccessList, msg.SetCodeAuthorizations, contractCreation, rules.IsHomestead, rules.IsIstanbul, rules.IsShanghai)
434+
gas, floorDataGas, err := IntrinsicGas(msg.Data, msg.AccessList, msg.SetCodeAuthorizations, contractCreation, rules.IsHomestead, rules.IsIstanbul, rules.IsShanghai)
421435
if err != nil {
422436
return nil, err
423437
}
424438
if st.gasRemaining < gas {
425439
return nil, fmt.Errorf("%w: have %d, want %d", ErrIntrinsicGas, st.gasRemaining, gas)
426440
}
441+
// Gas limit suffices for the floor data cost (EIP-7623)
442+
if rules.IsPrague {
443+
if st.gasRemaining < floorDataGas {
444+
return nil, fmt.Errorf("%w: have %d, want %d", ErrDataFloorGas, st.gasRemaining, floorDataGas)
445+
}
446+
}
427447
if t := st.evm.Config.Tracer; t != nil && t.OnGasChange != nil {
428448
t.OnGasChange(st.gasRemaining, st.gasRemaining-gas, tracing.GasChangeTxIntrinsicGas)
429449
}
@@ -490,11 +510,28 @@ func (st *stateTransition) execute() (*ExecutionResult, error) {
490510
var gasRefund uint64
491511
if !rules.IsLondon {
492512
// Before EIP-3529: refunds were capped to gasUsed / 2
493-
gasRefund = st.refundGas(params.RefundQuotient)
513+
gasRefund = st.refundAmount(params.RefundQuotient)
494514
} else {
495515
// After EIP-3529: refunds are capped to gasUsed / 5
496-
gasRefund = st.refundGas(params.RefundQuotientEIP3529)
516+
gasRefund = st.refundAmount(params.RefundQuotientEIP3529)
517+
}
518+
519+
if st.evm.Config.Tracer != nil && st.evm.Config.Tracer.OnGasChange != nil && gasRefund > 0 {
520+
st.evm.Config.Tracer.OnGasChange(st.gasRemaining, st.gasRemaining+gasRefund, tracing.GasChangeTxRefunds)
497521
}
522+
st.gasRemaining += gasRefund
523+
if rules.IsPrague {
524+
// After EIP-7623: Data-heavy transactions pay the floor gas.
525+
if st.gasUsed() < floorDataGas {
526+
prev := st.gasRemaining
527+
st.gasRemaining = st.initialGas - floorDataGas
528+
if t := st.evm.Config.Tracer; t != nil && t.OnGasChange != nil {
529+
t.OnGasChange(prev, st.gasRemaining, tracing.GasChangeTxDataFloor)
530+
}
531+
}
532+
}
533+
st.returnGas()
534+
498535
effectiveTip := msg.GasPrice
499536
if rules.IsLondon {
500537
effectiveTip = new(big.Int).Sub(msg.GasFeeCap, st.evm.Context.BaseFee)
@@ -585,19 +622,16 @@ func (st *stateTransition) applyAuthorization(msg *Message, auth *types.SetCodeA
585622
return nil
586623
}
587624

588-
func (st *stateTransition) refundGas(refundQuotient uint64) uint64 {
625+
func (st *stateTransition) refundAmount(refundQuotient uint64) uint64 {
589626
// Apply refund counter, capped to a refund quotient
590627
refund := st.gasUsed() / refundQuotient
591628
if refund > st.state.GetRefund() {
592629
refund = st.state.GetRefund()
593630
}
631+
return refund
632+
}
594633

595-
if st.evm.Config.Tracer != nil && st.evm.Config.Tracer.OnGasChange != nil && refund > 0 {
596-
st.evm.Config.Tracer.OnGasChange(st.gasRemaining, st.gasRemaining+refund, tracing.GasChangeTxRefunds)
597-
}
598-
599-
st.gasRemaining += refund
600-
634+
func (st *stateTransition) returnGas() {
601635
// Return ETH for remaining gas, exchanged at the original rate.
602636
remaining := uint256.NewInt(st.gasRemaining)
603637
remaining.Mul(remaining, uint256.MustFromBig(st.msg.GasPrice))
@@ -610,8 +644,6 @@ func (st *stateTransition) refundGas(refundQuotient uint64) uint64 {
610644
// Also return remaining gas to the block gas counter so it is
611645
// available for the next transaction.
612646
st.gp.AddGas(st.gasRemaining)
613-
614-
return refund
615647
}
616648

617649
// gasUsed returns the amount of gas used up by the state transition.

core/tracing/hooks.go

+3
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,9 @@ const (
314314
GasChangeWitnessCodeChunk GasChangeReason = 17
315315
// GasChangeWitnessContractCollisionCheck flags the event of adding to the witness when checking for contract address collision.
316316
GasChangeWitnessContractCollisionCheck GasChangeReason = 18
317+
// GasChangeTxDataFloor is the amount of extra gas the transaction has to pay to reach the minimum gas requirement for the
318+
// transaction data. This change will always be a negative change.
319+
GasChangeTxDataFloor GasChangeReason = 19
317320

318321
// GasChangeIgnored is a special value that can be used to indicate that the gas change should be ignored as
319322
// it will be "manually" tracked by a direct emit of the gas change event.

core/txpool/validation.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,19 @@ func ValidateTransaction(tx *types.Transaction, head *types.Header, signer types
108108
}
109109
// Ensure the transaction has more gas than the bare minimum needed to cover
110110
// the transaction metadata
111-
intrGas, err := core.IntrinsicGas(tx.Data(), tx.AccessList(), tx.SetCodeAuthorizations(), tx.To() == nil, true, opts.Config.IsIstanbul(head.Number), opts.Config.IsShanghai(head.Number, head.Time))
111+
intrGas, floorDataGas, err := core.IntrinsicGas(tx.Data(), tx.AccessList(), tx.SetCodeAuthorizations(), tx.To() == nil, true, opts.Config.IsIstanbul(head.Number), opts.Config.IsShanghai(head.Number, head.Time))
112112
if err != nil {
113113
return err
114114
}
115115
if tx.Gas() < intrGas {
116116
return fmt.Errorf("%w: gas %v, minimum needed %v", core.ErrIntrinsicGas, tx.Gas(), intrGas)
117117
}
118+
// Ensure the transaction can cover floor data gas.
119+
if opts.Config.IsPrague(head.Number, head.Time) {
120+
if tx.Gas() < floorDataGas {
121+
return fmt.Errorf("%w: gas %v, minimum needed %v", core.ErrDataFloorGas, tx.Gas(), floorDataGas)
122+
}
123+
}
118124
// Ensure the gasprice is high enough to cover the requirement of the calling pool
119125
if tx.GasTipCapIntCmp(opts.MinTip) < 0 {
120126
return fmt.Errorf("%w: gas tip cap %v, minimum needed %v", ErrUnderpriced, tx.GasTipCap(), opts.MinTip)

core/verkle_witness_test.go

+10-10
Original file line numberDiff line numberDiff line change
@@ -82,18 +82,18 @@ var (
8282

8383
func TestProcessVerkle(t *testing.T) {
8484
var (
85-
code = common.FromHex(`6060604052600a8060106000396000f360606040526008565b00`)
86-
intrinsicContractCreationGas, _ = IntrinsicGas(code, nil, nil, true, true, true, true)
85+
code = common.FromHex(`6060604052600a8060106000396000f360606040526008565b00`)
86+
intrinsicContractCreationGas, _, _ = IntrinsicGas(code, nil, nil, true, true, true, true)
8787
// A contract creation that calls EXTCODECOPY in the constructor. Used to ensure that the witness
8888
// will not contain that copied data.
8989
// Source: https://gist.github.com/gballet/a23db1e1cb4ed105616b5920feb75985
90-
codeWithExtCodeCopy = common.FromHex(`0x60806040526040516100109061017b565b604051809103906000f08015801561002c573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561007857600080fd5b5060008067ffffffffffffffff8111156100955761009461024a565b5b6040519080825280601f01601f1916602001820160405280156100c75781602001600182028036833780820191505090505b50905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506020600083833c81610101906101e3565b60405161010d90610187565b61011791906101a3565b604051809103906000f080158015610133573d6000803e3d6000fd5b50600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505061029b565b60d58061046783390190565b6102068061053c83390190565b61019d816101d9565b82525050565b60006020820190506101b86000830184610194565b92915050565b6000819050602082019050919050565b600081519050919050565b6000819050919050565b60006101ee826101ce565b826101f8846101be565b905061020381610279565b925060208210156102435761023e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360200360080261028e565b831692505b5050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600061028582516101d9565b80915050919050565b600082821b905092915050565b6101bd806102aa6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f566852414610030575b600080fd5b61003861004e565b6040516100459190610146565b60405180910390f35b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166381ca91d36040518163ffffffff1660e01b815260040160206040518083038186803b1580156100b857600080fd5b505afa1580156100cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100f0919061010a565b905090565b60008151905061010481610170565b92915050565b6000602082840312156101205761011f61016b565b5b600061012e848285016100f5565b91505092915050565b61014081610161565b82525050565b600060208201905061015b6000830184610137565b92915050565b6000819050919050565b600080fd5b61017981610161565b811461018457600080fd5b5056fea2646970667358221220a6a0e11af79f176f9c421b7b12f441356b25f6489b83d38cc828a701720b41f164736f6c63430008070033608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063ab5ed15014602d575b600080fd5b60336047565b604051603e9190605d565b60405180910390f35b60006001905090565b6057816076565b82525050565b6000602082019050607060008301846050565b92915050565b600081905091905056fea26469706673582212203a14eb0d5cd07c277d3e24912f110ddda3e553245a99afc4eeefb2fbae5327aa64736f6c63430008070033608060405234801561001057600080fd5b5060405161020638038061020683398181016040528101906100329190610063565b60018160001c6100429190610090565b60008190555050610145565b60008151905061005d8161012e565b92915050565b60006020828403121561007957610078610129565b5b60006100878482850161004e565b91505092915050565b600061009b826100f0565b91506100a6836100f0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156100db576100da6100fa565b5b828201905092915050565b6000819050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b610137816100e6565b811461014257600080fd5b50565b60b3806101536000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806381ca91d314602d575b600080fd5b60336047565b604051603e9190605a565b60405180910390f35b60005481565b6054816073565b82525050565b6000602082019050606d6000830184604d565b92915050565b600081905091905056fea26469706673582212209bff7098a2f526de1ad499866f27d6d0d6f17b74a413036d6063ca6a0998ca4264736f6c63430008070033`)
91-
intrinsicCodeWithExtCodeCopyGas, _ = IntrinsicGas(codeWithExtCodeCopy, nil, nil, true, true, true, true)
92-
signer = types.LatestSigner(testVerkleChainConfig)
93-
testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
94-
bcdb = rawdb.NewMemoryDatabase() // Database for the blockchain
95-
coinbase = common.HexToAddress("0x71562b71999873DB5b286dF957af199Ec94617F7")
96-
gspec = &Genesis{
90+
codeWithExtCodeCopy = common.FromHex(`0x60806040526040516100109061017b565b604051809103906000f08015801561002c573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561007857600080fd5b5060008067ffffffffffffffff8111156100955761009461024a565b5b6040519080825280601f01601f1916602001820160405280156100c75781602001600182028036833780820191505090505b50905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506020600083833c81610101906101e3565b60405161010d90610187565b61011791906101a3565b604051809103906000f080158015610133573d6000803e3d6000fd5b50600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505061029b565b60d58061046783390190565b6102068061053c83390190565b61019d816101d9565b82525050565b60006020820190506101b86000830184610194565b92915050565b6000819050602082019050919050565b600081519050919050565b6000819050919050565b60006101ee826101ce565b826101f8846101be565b905061020381610279565b925060208210156102435761023e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360200360080261028e565b831692505b5050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600061028582516101d9565b80915050919050565b600082821b905092915050565b6101bd806102aa6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f566852414610030575b600080fd5b61003861004e565b6040516100459190610146565b60405180910390f35b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166381ca91d36040518163ffffffff1660e01b815260040160206040518083038186803b1580156100b857600080fd5b505afa1580156100cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100f0919061010a565b905090565b60008151905061010481610170565b92915050565b6000602082840312156101205761011f61016b565b5b600061012e848285016100f5565b91505092915050565b61014081610161565b82525050565b600060208201905061015b6000830184610137565b92915050565b6000819050919050565b600080fd5b61017981610161565b811461018457600080fd5b5056fea2646970667358221220a6a0e11af79f176f9c421b7b12f441356b25f6489b83d38cc828a701720b41f164736f6c63430008070033608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063ab5ed15014602d575b600080fd5b60336047565b604051603e9190605d565b60405180910390f35b60006001905090565b6057816076565b82525050565b6000602082019050607060008301846050565b92915050565b600081905091905056fea26469706673582212203a14eb0d5cd07c277d3e24912f110ddda3e553245a99afc4eeefb2fbae5327aa64736f6c63430008070033608060405234801561001057600080fd5b5060405161020638038061020683398181016040528101906100329190610063565b60018160001c6100429190610090565b60008190555050610145565b60008151905061005d8161012e565b92915050565b60006020828403121561007957610078610129565b5b60006100878482850161004e565b91505092915050565b600061009b826100f0565b91506100a6836100f0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156100db576100da6100fa565b5b828201905092915050565b6000819050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b610137816100e6565b811461014257600080fd5b50565b60b3806101536000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806381ca91d314602d575b600080fd5b60336047565b604051603e9190605a565b60405180910390f35b60005481565b6054816073565b82525050565b6000602082019050606d6000830184604d565b92915050565b600081905091905056fea26469706673582212209bff7098a2f526de1ad499866f27d6d0d6f17b74a413036d6063ca6a0998ca4264736f6c63430008070033`)
91+
intrinsicCodeWithExtCodeCopyGas, _, _ = IntrinsicGas(codeWithExtCodeCopy, nil, nil, true, true, true, true)
92+
signer = types.LatestSigner(testVerkleChainConfig)
93+
testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
94+
bcdb = rawdb.NewMemoryDatabase() // Database for the blockchain
95+
coinbase = common.HexToAddress("0x71562b71999873DB5b286dF957af199Ec94617F7")
96+
gspec = &Genesis{
9797
Config: testVerkleChainConfig,
9898
Alloc: GenesisAlloc{
9999
coinbase: {
@@ -145,7 +145,7 @@ func TestProcessVerkle(t *testing.T) {
145145
params.WitnessChunkWriteCost + /* SSTORE in constructor */
146146
params.WitnessChunkReadCost + params.WitnessChunkWriteCost + /* write code hash for tx creation */
147147
15*(params.WitnessChunkReadCost+params.WitnessChunkWriteCost) + /* code chunks #0..#14 */
148-
4844 /* execution costs */
148+
uint64(4844) /* execution costs */
149149
blockGasUsagesExpected := []uint64{
150150
txCost1*2 + txCost2,
151151
txCost1*2 + txCost2 + contractCreationCost + codeWithExtCodeCopyGas,

0 commit comments

Comments
 (0)