diff --git a/fvm/bootstrap.go b/fvm/bootstrap.go index 76b12a02797..8ddf12ff158 100644 --- a/fvm/bootstrap.go +++ b/fvm/bootstrap.go @@ -1123,7 +1123,7 @@ func (b *bootstrapExecutor) setupVMBridge(serviceAddress flow.Address, env *temp // Arbitrary high gas limit that can be used for all the // EVM transactions to ensure none of them run out of gas - gasLimit := 15000000 + gasLimit := 20_000_000 deploymentValue := 0.0 // Retrieve the factory bytecode from the JSON args diff --git a/fvm/evm/emulator/config.go b/fvm/evm/emulator/config.go index ec6cc38bf76..b8aeecfcb2b 100644 --- a/fvm/evm/emulator/config.go +++ b/fvm/evm/emulator/config.go @@ -8,6 +8,7 @@ import ( gethVM "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth/tracers" gethParams "github.com/ethereum/go-ethereum/params" + "github.com/holiman/uint256" "github.com/onflow/flow-go/fvm/evm/types" ) @@ -25,6 +26,10 @@ var ( PreviewnetOsakaActivation = uint64(0) // already on Osaka for PreviewNet TestnetOsakaActivation = uint64(1763575200) // Wednesday, November 19, 2025 18:00:00 GMT+0000 MainnetOsakaActivation = uint64(1764784800) // Wednesday, December 03, 2025 18:00:00 GMT+0000 + + PreviewnetAmsterdamActivation = uint64(0) // already on Amsterdam for PreviewNet + TestnetAmsterdamActivation = uint64(1798740000) // Thursday, December 31, 2026 at 18:00:00 GMT+0000 + MainnetAmsterdamActivation = uint64(1798740000) // Thursday, December 31, 2026 at 18:00:00 GMT+0000 ) // Config aggregates all the configuration (chain, evm, block, tx, ...) @@ -102,22 +107,26 @@ func MakeChainConfig(chainID *big.Int) *gethParams.ChainConfig { MuirGlacierBlock: bigZero, // already on MuirGlacier // Fork scheduling based on timestamps - ShanghaiTime: &zero, // already on Shanghai - CancunTime: &zero, // already on Cancun - PragueTime: nil, // this is conditionally set below - OsakaTime: nil, // this is conditionally set below - VerkleTime: nil, // not on Verkle + ShanghaiTime: &zero, // already on Shanghai + CancunTime: &zero, // already on Cancun + PragueTime: nil, // this is conditionally set below + OsakaTime: nil, // this is conditionally set below + AmsterdamTime: nil, // this is conditionally set below + UBTTime: nil, // not on Verkle (a.k.a UBT) } if chainID.Cmp(types.FlowEVMPreviewNetChainID) == 0 { chainConfig.PragueTime = &PreviewnetPragueActivation chainConfig.OsakaTime = &PreviewnetOsakaActivation + chainConfig.AmsterdamTime = &PreviewnetAmsterdamActivation } else if chainID.Cmp(types.FlowEVMTestNetChainID) == 0 { chainConfig.PragueTime = &TestnetPragueActivation chainConfig.OsakaTime = &TestnetOsakaActivation + chainConfig.AmsterdamTime = &TestnetAmsterdamActivation } else if chainID.Cmp(types.FlowEVMMainNetChainID) == 0 { chainConfig.PragueTime = &MainnetPragueActivation chainConfig.OsakaTime = &MainnetOsakaActivation + chainConfig.AmsterdamTime = &MainnetAmsterdamActivation } return chainConfig @@ -135,8 +144,7 @@ func defaultConfig() *Config { NoBaseFee: true, }, TxContext: &gethVM.TxContext{ - GasPrice: new(big.Int), - BlobFeeCap: new(big.Int), + GasPrice: new(uint256.Int), }, BlockContext: &gethVM.BlockContext{ CanTransfer: gethCore.CanTransfer, @@ -146,6 +154,7 @@ func defaultConfig() *Config { GetHash: func(n uint64) gethCommon.Hash { return gethCommon.Hash{} }, + CostPerStateByte: gethParams.CostPerStateByte, }, PCTracker: NewCallTracker(), } @@ -188,7 +197,7 @@ func WithOrigin(origin gethCommon.Address) Option { // WithGasPrice sets the gas price for the transaction (usually the one sets by the sender) func WithGasPrice(gasPrice *big.Int) Option { return func(c *Config) *Config { - c.TxContext.GasPrice = gasPrice + c.TxContext.GasPrice = uint256.MustFromBig(gasPrice) return c } } @@ -264,6 +273,14 @@ func WithRandom(rand *gethCommon.Hash) Option { } } +// WithSlotNum sets the slot number in the block context +func WithSlotNum(slotNum uint64) Option { + return func(c *Config) *Config { + c.BlockContext.SlotNum = slotNum + return c + } +} + // WithTransactionTracer sets a transaction tracer func WithTransactionTracer(tracer *tracers.Tracer) Option { return func(c *Config) *Config { diff --git a/fvm/evm/emulator/emulator.go b/fvm/evm/emulator/emulator.go index 2a7f4409d2e..41ba28c1598 100644 --- a/fvm/evm/emulator/emulator.go +++ b/fvm/evm/emulator/emulator.go @@ -3,12 +3,14 @@ package emulator import ( "errors" "fmt" + "math" "math/big" gethCommon "github.com/ethereum/go-ethereum/common" gethCore "github.com/ethereum/go-ethereum/core" gethTracing "github.com/ethereum/go-ethereum/core/tracing" gethTypes "github.com/ethereum/go-ethereum/core/types" + gethBAL "github.com/ethereum/go-ethereum/core/types/bal" gethVM "github.com/ethereum/go-ethereum/core/vm" gethCrypto "github.com/ethereum/go-ethereum/crypto" gethParams "github.com/ethereum/go-ethereum/params" @@ -51,6 +53,7 @@ func newConfig(ctx types.BlockContext) *Config { WithExtraPrecompiledContracts(ctx.ExtraPrecompiledContracts), WithGetBlockHashFunction(ctx.GetHashFunc), WithRandom(&ctx.Random), + WithSlotNum(ctx.SlotNum), WithTransactionTracer(ctx.Tracer), WithBlockTotalGasUsedSoFar(ctx.TotalGasUsedSoFar), WithBlockTxCountSoFar(ctx.TxCountSoFar), @@ -162,6 +165,9 @@ func (bl *BlockView) DirectCall(call *types.DirectCall) (res *types.Result, err case types.WithdrawCallSubType: return proc.withdrawFrom(call) case types.DeployCallSubType: + // this is effectively deploying only COAs, with the `to` field + // being generated by the COA address allocator and set as the + // deployment target address if !call.EmptyToField() { return proc.deployAt(call) } @@ -204,7 +210,7 @@ func (bl *BlockView) RunTransaction( } // all commit errors (StateDB errors) has to be returned - res.StateChangeCommitment, err = proc.commit(true) + res.StateChangeCommitment, res.StateAccessList, err = proc.commit(true) if err != nil { return nil, err } @@ -260,7 +266,7 @@ func (bl *BlockView) BatchRunTransactions(txs []*gethTypes.Transaction) ([]*type } // all commit errors (StateDB errors) has to be returned - res.StateChangeCommitment, err = proc.commit(false) + res.StateChangeCommitment, res.StateAccessList, err = proc.commit(false) if err != nil { return nil, err } @@ -307,23 +313,87 @@ func (bl *BlockView) DryRunTransaction( return nil, err } - // convert tx into message - msg, err := gethCore.TransactionToMessage( - tx, - GetSigner(bl.config), - proc.config.BlockContext.BaseFee, - ) + res := types.Result{ + TxType: tx.Type(), + TxHash: tx.Hash(), + } - // we can ignore invalid signature errors since we don't expect signed transactions - if !errors.Is(err, gethTypes.ErrInvalidSig) { - return nil, err + value, overflow := uint256.FromBig(tx.Value()) + if overflow { + res.SetValidationError( + fmt.Errorf("value exceeds 256 bits: address %v", from.Hex()), + ) + return &res, nil } - // use the from as the signer - msg.From = from - // we need to skip nonce/transaction checks for dry run - msg.SkipNonceChecks = true - msg.SkipTransactionChecks = true + gasPrice, overflow := uint256.FromBig(tx.GasPrice()) + if overflow { + res.SetValidationError( + fmt.Errorf( + "%w: address %v, maxFeePerGas bit length: %d", + gethCore.ErrFeeCapVeryHigh, + from.Hex(), + tx.GasPrice().BitLen(), + ), + ) + return &res, nil + } + + txGasFeeCap := tx.GasFeeCap() + gasFeeCap, overflow := uint256.FromBig(txGasFeeCap) + if overflow { + res.SetValidationError( + fmt.Errorf( + "%w: address %v, maxFeePerGas bit length: %d", + gethCore.ErrFeeCapVeryHigh, + from.Hex(), + tx.GasFeeCap().BitLen(), + ), + ) + return &res, nil + } + + txGasTipCap := tx.GasTipCap() + gasTipCap, overflow := uint256.FromBig(txGasTipCap) + if overflow { + res.SetValidationError( + fmt.Errorf( + "%w: address %v, maxPriorityFeePerGas bit length: %d", + gethCore.ErrTipVeryHigh, + from.Hex(), + tx.GasTipCap().BitLen(), + ), + ) + return &res, nil + } + + msg := &gethCore.Message{ + From: from, + To: tx.To(), + Value: value, + Data: tx.Data(), + Nonce: tx.Nonce(), + GasLimit: tx.Gas(), + GasPrice: gasPrice, + GasTipCap: gasTipCap, + GasFeeCap: gasFeeCap, + SetCodeAuthorizations: tx.SetCodeAuthorizations(), + AccessList: tx.AccessList(), + SkipNonceChecks: true, + SkipTransactionChecks: true, + } + + // If baseFee provided, set gasPrice to effectiveGasPrice. + baseFee := proc.config.BlockContext.BaseFee + if baseFee != nil { + effectiveGasPrice := new(big.Int).Add(baseFee, txGasTipCap) + if effectiveGasPrice.Cmp(txGasFeeCap) > 0 { + effectiveGasPrice = txGasFeeCap + } + // EffectiveGasPrice is already capped by txGasFeeCap, therefore + // the overflow check is not required. + msg.GasPrice = uint256.MustFromBig(effectiveGasPrice) + } // run and return without committing the state changes return proc.run(msg, tx.Hash(), tx.Type()) @@ -361,21 +431,19 @@ type procedure struct { } // commit commits the changes to the state (with optional finalization) -func (proc *procedure) commit(finalize bool) (hash.Hash, error) { - // Calling `StateDB.Finalise(true)` is currently a no-op, but - // we add it here to be more in line with how its envisioned. - proc.state.Finalise(true) +func (proc *procedure) commit(finalize bool) (hash.Hash, *gethBAL.ConstructionBlockAccessList, error) { + bal := proc.state.Finalise(true) stateUpdateCommitment, err := proc.state.Commit(finalize) if err != nil { // if known types (state errors) don't do anything and return if types.IsAFatalError(err) || types.IsAStateError(err) || types.IsABackendError(err) { - return stateUpdateCommitment, err + return stateUpdateCommitment, bal, err } // else is a new fatal error - return stateUpdateCommitment, types.NewFatalError(err) + return stateUpdateCommitment, bal, types.NewFatalError(err) } - return stateUpdateCommitment, nil + return stateUpdateCommitment, bal, nil } func (proc *procedure) mintTo( @@ -420,7 +488,7 @@ func (proc *procedure) mintTo( } // commit and finalize the state and return any stateDB error - res.StateChangeCommitment, err = proc.commit(true) + res.StateChangeCommitment, res.StateAccessList, err = proc.commit(true) return res, err } @@ -471,7 +539,7 @@ func (proc *procedure) withdrawFrom( proc.state.SubBalance(bridge, value, gethTracing.BalanceIncreaseWithdrawal) // commit and finalize the state and return any stateDB error - res.StateChangeCommitment, err = proc.commit(true) + res.StateChangeCommitment, res.StateAccessList, err = proc.commit(true) return res, err } @@ -524,104 +592,121 @@ func (proc *procedure) deployAt( }() } - addr := call.To.ToCommon() + caller := call.From.ToCommon() // pre check 1 - check balance of the source if call.Value.Sign() != 0 && - !proc.evm.Context.CanTransfer(proc.state, call.From.ToCommon(), castedValue) { + !proc.evm.Context.CanTransfer(proc.state, caller, castedValue) { res.SetValidationError(gethCore.ErrInsufficientFundsForTransfer) return res, nil } + // increment the caller's nonce after passing all validations + nonce := proc.state.GetNonce(caller) + if nonce+1 < nonce { + res.SetValidationError(gethVM.ErrNonceUintOverflow) + return res, nil + } + proc.state.SetNonce( + caller, + nonce+1, + gethTracing.NonceChangeContractCreator, + ) + + // After Amsterdam we limit the regular gas to 16M, the data gas to the transaction limit + limit := call.GasLimit + if proc.config.ChainRules().IsAmsterdam { + limit = min(call.GasLimit, gethParams.MaxTxGas) + } + gasBudget := gethVM.NewGasBudget(limit, call.GasLimit-limit) + + reservoir := gasBudget.StateGas + + addr := call.To.ToCommon() + // update access list (Berlin) + proc.state.AddAddressToAccessList(addr) + // pre check 2 - ensure there's no existing eoa or contract is deployed at the address contractHash := proc.state.GetCodeHash(addr) if proc.state.GetNonce(addr) != 0 || (contractHash != (gethCommon.Hash{}) && contractHash != gethTypes.EmptyCodeHash) { res.VMError = gethVM.ErrContractAddressCollision + halt := gasBudget.ExitHalt(reservoir) + if proc.evm.Config.Tracer.HasGasHook() { + proc.evm.Config.Tracer.EmitGasChange( + gasBudget.AsTracing(), + halt.AsTracing(), + gethTracing.GasChangeCallFailedExecution, + ) + } return res, nil } - callerCommon := call.From.ToCommon() - // setup caller if doesn't exist - if !proc.state.Exist(callerCommon) { - proc.state.CreateAccount(callerCommon) + // create a new account on the state only if the object was not present. + // it might be possible the contract code is deployed to a pre-existent + // account with non-zero balance. + snapshot := proc.evm.StateDB.Snapshot() + if !proc.state.Exist(addr) { + proc.state.CreateAccount(addr) } - // increment the nonce for the caller - proc.state.SetNonce( - callerCommon, - proc.state.GetNonce(callerCommon)+1, - gethTracing.NonceChangeContractCreator, - ) - // setup account - proc.state.CreateAccount(addr) + // CreateContract means that regardless of whether the account previously existed + // in the state trie or not, it _now_ becomes created as a _contract_ account. + // This is performed _prior_ to executing the initcode, since the initcode + // acts inside that account. + proc.state.CreateContract(addr) proc.state.SetNonce(addr, 1, gethTracing.NonceChangeNewContract) // (EIP-158) + rules := proc.config.ChainRules() if call.Value.Sign() > 0 { proc.evm.Context.Transfer( // transfer value proc.state, - callerCommon, + caller, addr, uint256.MustFromBig(call.Value), + &rules, ) } - // run code through interpreter - // this would check for errors and computes the final bytes to be stored under account - var err error + // initialise a new contract and set the code that is to be used by the EVM. + // the contract is a scoped environment for this execution context only. contract := gethVM.NewContract( - callerCommon, + caller, addr, castedValue, - call.GasLimit, + gasBudget, nil, ) - contract.SetCallCode(gethCrypto.Keccak256Hash(call.Data), call.Data) - // update access list (Berlin) - proc.state.AddAddressToAccessList(addr) - - ret, err := proc.evm.Run(contract, nil, false) - gasCost := uint64(len(ret)) * gethParams.CreateDataGas - res.GasConsumed = gasCost + // explicitly set the code to a null hash to prevent caching of jump analysis + // for the initialization code. + contract.SetCallCode(gethCommon.Hash{}, call.Data) + contract.IsDeployment = true + gasConsumed, err := proc.initNewContract(contract, addr, call) // handle errors if err != nil { + proc.evm.StateDB.RevertToSnapshot(snapshot) + // for all errors except this one consume all the remaining gas (Homestead) + exit := contract.Gas.Exit(err, reservoir) if err != gethVM.ErrExecutionReverted { - res.GasConsumed = call.GasLimit + res.GasConsumed = gasConsumed + if proc.evm.Config.Tracer.HasGasHook() { + proc.evm.Config.Tracer.EmitGasChange( + contract.Gas.AsTracing(), + exit.AsTracing(), + gethTracing.GasChangeCallFailedExecution, + ) + } } res.VMError = err return res, nil } - // update gas usage - if gasCost > call.GasLimit { - // consume all the remaining gas (Homestead) - res.GasConsumed = call.GasLimit - res.VMError = gethVM.ErrCodeStoreOutOfGas - return res, nil - } - - // check max code size (EIP-158) - if len(ret) > gethParams.MaxCodeSize { - // consume all the remaining gas (Homestead) - res.GasConsumed = call.GasLimit - res.VMError = gethVM.ErrMaxCodeSizeExceeded - return res, nil - } - - // reject code starting with 0xEF (EIP-3541) - if len(ret) >= 1 && ret[0] == 0xEF { - // consume all the remaining gas (Homestead) - res.GasConsumed = call.GasLimit - res.VMError = gethVM.ErrInvalidCode - return res, nil - } - + res.GasConsumed = gasConsumed res.DeployedContractAddress = &call.To res.CumulativeGasUsed = proc.config.BlockTotalGasUsedSoFar + res.GasConsumed - proc.state.SetCode(addr, ret, gethTracing.CodeChangeContractCreation) - res.StateChangeCommitment, err = proc.commit(true) + res.StateChangeCommitment, res.StateAccessList, err = proc.commit(true) return res, err } @@ -638,7 +723,7 @@ func (proc *procedure) runDirect( return nil, err } // commit and finalize the state and return any stateDB error - res.StateChangeCommitment, err = proc.commit(true) + res.StateChangeCommitment, res.StateAccessList, err = proc.commit(true) return res, err } @@ -676,14 +761,15 @@ func (proc *procedure) run( // Set gas pool based on block gas limit // if the block gas limit is set to anything than max // we need to update this code. - gasPool := (*gethCore.GasPool)(&proc.config.BlockContext.GasLimit) + gasPool := gethCore.NewGasPool( + proc.config.BlockContext.GasLimit - proc.config.BlockTotalGasUsedSoFar, + ) // transit the state - execResult, err := gethCore.ApplyMessage( - proc.evm, - msg, - gasPool, - ) + txIndex := proc.config.BlockTxCountSoFar + // `blockAccessIndex` should be 0 for pre-execution, 1..n for transactions, n+1 for post-execution + proc.state.SetTxContext(txHash, int(txIndex), uint32(txIndex+1)) + execResult, err := gethCore.ApplyMessage(proc.evm, msg, gasPool) if err != nil { // if the error is a fatal error or a non-fatal state error or a backend err return it // this condition should never happen given all StateDB errors are withheld for the commit time. @@ -696,7 +782,6 @@ func (proc *procedure) run( return &res, nil } - txIndex := proc.config.BlockTxCountSoFar // if pre-checks are passed, the exec result won't be nil if execResult != nil { res.GasConsumed = execResult.UsedGas @@ -737,6 +822,62 @@ func (proc *procedure) run( return &res, nil } +func (proc *procedure) initNewContract( + contract *gethVM.Contract, + addr gethCommon.Address, + call *types.DirectCall, +) (uint64, error) { + ret, err := proc.evm.Run(contract, nil, false) + if err != nil { + return call.GasLimit, err + } + + // check prefix before gas calculation. + // reject code starting with 0xEF (EIP-3541) + if len(ret) >= 1 && ret[0] == 0xEF { + return call.GasLimit, gethVM.ErrInvalidCode + } + + var gasConsumed uint64 + + rules := proc.config.ChainRules() + if rules.IsAmsterdam { + // check max code size BEFORE charging gas so over-max code + // does not consume state gas (which would inflate tx_state). + // check whether the max code size has been exceeded + if err := gethVM.CheckMaxCodeSize(&rules, uint64(len(ret))); err != nil { + return call.GasLimit, gethVM.ErrMaxCodeSizeExceeded + } + // charge regular gas (hash cost) before state gas. + regularCost := toWordSize(uint64(len(ret))) * gethParams.Keccak256WordGas + if !chargeRegular(contract, regularCost, proc.evm.Config.Tracer, gethTracing.GasChangeCallCodeStorage) { + return call.GasLimit, gethVM.ErrCodeStoreOutOfGas + } + // charge state gas (code-deposit) afterwards. + stateCost := uint64(len(ret)) * proc.evm.Context.CostPerStateByte + if !chargeState(contract, stateCost, proc.evm.Config.Tracer, gethTracing.GasChangeCallCodeStorage) { + return call.GasLimit, gethVM.ErrCodeStoreOutOfGas + } + gasConsumed = regularCost + stateCost + } else { + // update gas usage + createDataCost := uint64(len(ret)) * gethParams.CreateDataGas + if !chargeRegular(contract, createDataCost, proc.evm.Config.Tracer, gethTracing.GasChangeCallCodeStorage) { + return call.GasLimit, gethVM.ErrCodeStoreOutOfGas + } + if err := gethVM.CheckMaxCodeSize(&rules, uint64(len(ret))); err != nil { + return call.GasLimit, gethVM.ErrMaxCodeSizeExceeded + } + gasConsumed = createDataCost + } + + if len(ret) > 0 { + proc.state.SetCode(addr, ret, gethTracing.CodeChangeContractCreation) + } + + return gasConsumed, nil +} + func checkAndConvertValue(input *big.Int) (converted *uint256.Int, isValid bool) { // check for negative input if input.Sign() < 0 { @@ -749,3 +890,47 @@ func checkAndConvertValue(input *big.Int) (converted *uint256.Int, isValid bool) } return value, true } + +// chargeRegular deducts regular gas only, with tracer integration. +// Returns false on OOG. Delegates the arithmetic to GasBudget.ChargeRegular. +func chargeRegular( + c *gethVM.Contract, + r uint64, + logger *gethTracing.Hooks, + reason gethTracing.GasChangeReason, +) bool { + prior, ok := c.Gas.ChargeRegular(r) + if !ok { + return false + } + if logger.HasGasHook() && reason != gethTracing.GasChangeIgnored { + logger.EmitGasChange(prior.AsTracing(), c.Gas.AsTracing(), reason) + } + return true +} + +// chargeState deducts state gas (spilling into regular when the reservoir is +// exhausted), with tracer integration. Returns false on OOG. +func chargeState( + c *gethVM.Contract, + s uint64, + logger *gethTracing.Hooks, + reason gethTracing.GasChangeReason, +) bool { + prior, ok := c.Gas.ChargeState(s) + if !ok { + return false + } + if logger.HasGasHook() && reason != gethTracing.GasChangeIgnored { + logger.EmitGasChange(prior.AsTracing(), c.Gas.AsTracing(), reason) + } + return true +} + +// toWordSize returns the ceiled word size required for memory expansion. +func toWordSize(size uint64) uint64 { + if size > math.MaxUint64-31 { + return math.MaxUint64/32 + 1 + } + return (size + 31) / 32 +} diff --git a/fvm/evm/emulator/emulator_test.go b/fvm/evm/emulator/emulator_test.go index 78f3d73c65e..00b77e0851f 100644 --- a/fvm/evm/emulator/emulator_test.go +++ b/fvm/evm/emulator/emulator_test.go @@ -7,6 +7,7 @@ import ( "strings" "testing" + gethABI "github.com/ethereum/go-ethereum/accounts/abi" gethCommon "github.com/ethereum/go-ethereum/common" gethTypes "github.com/ethereum/go-ethereum/core/types" gethVM "github.com/ethereum/go-ethereum/core/vm" @@ -63,7 +64,7 @@ func TestNativeTokenBridging(t *testing.T) { call := types.NewDepositCall(bridgeAccount, testAccount, originalBalance, 0) res, err := blk.DirectCall(call) requireSuccessfulExecution(t, err, res) - require.Equal(t, defaultCtx.DirectCallBaseGasUsage, res.GasConsumed) + require.Equal(t, uint64(204_600), res.GasConsumed) require.Equal(t, call.Hash(), res.TxHash) }) }) @@ -90,7 +91,7 @@ func TestNativeTokenBridging(t *testing.T) { call := types.NewDeployCall( bridgeAccount, emptyContractByteCode, - 100_000, + 350_000, big.NewInt(0), 1) res, err := blk.DirectCall(call) @@ -191,8 +192,7 @@ func TestNativeTokenBridging(t *testing.T) { RunWithNewEmulator(t, backend, rootAddr, func(env *emulator.Emulator) { RunWithNewBlockView(t, env, func(blk types.BlockView) { // Test withdraw amounts that overflow the UInt256 range - amount := big.NewInt(1) - amount.Lsh(amount, 256) + amount := new(big.Int).Lsh(big.NewInt(1), 256) call := types.NewWithdrawCall(bridgeAccount, testAccount, amount, testAccountNonce) res, err := blk.DirectCall(call) @@ -207,9 +207,8 @@ func TestNativeTokenBridging(t *testing.T) { }) RunWithNewEmulator(t, backend, rootAddr, func(env *emulator.Emulator) { RunWithNewBlockView(t, env, func(blk types.BlockView) { - // Test withdraw amounts within the max range of UInt256 - amount := big.NewInt(1) - amount.Lsh(amount, 255) + // Test withdraw amounts within the max range of Int256 + amount := gethABI.MaxInt256 call := types.NewWithdrawCall(bridgeAccount, testAccount, amount, testAccountNonce) res, err := blk.DirectCall(call) @@ -566,7 +565,7 @@ func TestContractInteraction(t *testing.T) { Nonce: account.Nonce(), GasTipCap: big.NewInt(2), GasFeeCap: big.NewInt(3), - Gas: gethParams.TxGas, + Gas: 204_600, To: &gethCommon.Address{}, Value: big.NewInt(1), }), @@ -851,7 +850,7 @@ func TestFactoryPatterns(t *testing.T) { factoryDeployer, factoryAddress, factoryContract.MakeCallData(t, "deploy", salt), - 250_000, + 1_500_000, big.NewInt(0), 0, ), @@ -890,7 +889,7 @@ func TestFactoryPatterns(t *testing.T) { contracts.FactoryDeployableContractABIJSON, "set", storedValue), - 120_000, + 225_000, big.NewInt(0), 0, ), @@ -909,7 +908,7 @@ func TestFactoryPatterns(t *testing.T) { contracts.FactoryDeployableContractABIJSON, "destroy", refundAddress), - 120_000, + 225_000, big.NewInt(0), 0, ), @@ -968,7 +967,7 @@ func TestFactoryPatterns(t *testing.T) { "deployAndDestroy", salt, storedValue), - 400_000, + 1_500_000, big.NewInt(0), 0, ), @@ -995,7 +994,7 @@ func TestFactoryPatterns(t *testing.T) { factoryDeployer, factoryAddress, factoryContract.MakeCallData(t, "depositAndDeploy", salt, balance, storedValue), - 250_000, + 1_550_000, big.NewInt(0), 1, ), @@ -1047,7 +1046,7 @@ func TestFactoryPatterns(t *testing.T) { factoryDeployer, factoryAddress, factoryContract.MakeCallData(t, "depositDeployAndDestroy", salt, big.NewInt(100), big.NewInt(10)), - 250_000, + 1_550_000, big.NewInt(0), 1, ), diff --git a/fvm/evm/emulator/state/base.go b/fvm/evm/emulator/state/base.go index 3ae602e9c00..7871764b977 100644 --- a/fvm/evm/emulator/state/base.go +++ b/fvm/evm/emulator/state/base.go @@ -250,6 +250,14 @@ func (v *BaseView) CreateAccount( if err != nil { return err } + } else { + // all codeless accounts should have the following `EmptyCodeHash` + // edge case for special system addresses, such as: + // - 0x0000000000000000000000020000000000000000 + // - 0x0000000000000000000000030000000000000000 + // which are used for COA deployments and gas fees collection. + // This is particularly useful for certain built-in tracers. + codeHash = gethTypes.EmptyCodeHash } // create a new account and store it diff --git a/fvm/evm/emulator/state/delta.go b/fvm/evm/emulator/state/delta.go index 6f3838dc7f9..9b08fec992e 100644 --- a/fvm/evm/emulator/state/delta.go +++ b/fvm/evm/emulator/state/delta.go @@ -577,10 +577,6 @@ func (d *DeltaView) DirtyAddresses() map[gethCommon.Address]struct{} { } // DirtySlots returns a set of slots that has been updated in this view -func (d *DeltaView) DirtySlots() map[types.SlotAddress]struct{} { - dirtySlots := make(map[types.SlotAddress]struct{}) - for sk := range d.slots { - dirtySlots[sk] = struct{}{} - } - return dirtySlots +func (d *DeltaView) DirtySlots() map[types.SlotAddress]gethCommon.Hash { + return d.slots } diff --git a/fvm/evm/emulator/state/stateDB.go b/fvm/evm/emulator/state/stateDB.go index 08a60146751..1c6c23572a2 100644 --- a/fvm/evm/emulator/state/stateDB.go +++ b/fvm/evm/emulator/state/stateDB.go @@ -11,8 +11,8 @@ import ( gethStateless "github.com/ethereum/go-ethereum/core/stateless" gethTracing "github.com/ethereum/go-ethereum/core/tracing" gethTypes "github.com/ethereum/go-ethereum/core/types" + gethBAL "github.com/ethereum/go-ethereum/core/types/bal" gethParams "github.com/ethereum/go-ethereum/params" - gethUtils "github.com/ethereum/go-ethereum/trie/utils" "github.com/holiman/uint256" "github.com/onflow/atree" "github.com/onflow/crypto/hash" @@ -21,6 +21,11 @@ import ( "github.com/onflow/flow-go/model/flow" ) +type removedAccountWithBalance struct { + address gethCommon.Address + balance *uint256.Int +} + // StateDB implements a types.StateDB interface // // stateDB interface defined by the Geth doesn't support returning errors @@ -37,6 +42,12 @@ type StateDB struct { baseView types.BaseView views []*DeltaView cachedError error + + // Per-transaction state access footprint for EIP-7928 + stateAccessList *gethBAL.ConstructionBlockAccessList + + // Block access index (0 for pre-execution, 1..n for transactions, n+1 for post-execution) + blockAccessIndex uint32 } var _ types.StateDB = &StateDB{} @@ -60,6 +71,8 @@ func NewStateDB(ledger atree.Ledger, root flow.Address) (*StateDB, error) { // // this should also return true for self destructed accounts during the transaction execution. func (db *StateDB) Exist(addr gethCommon.Address) bool { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) exist, err := db.latestView().Exist(addr) db.handleError(err) return exist @@ -69,6 +82,8 @@ func (db *StateDB) Exist(addr gethCommon.Address) bool { // // Empty is defined according to EIP161 (balance = nonce = code = 0). func (db *StateDB) Empty(addr gethCommon.Address) bool { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) if !db.Exist(addr) { return true } @@ -77,6 +92,12 @@ func (db *StateDB) Empty(addr gethCommon.Address) bool { bytes.Equal(db.GetCodeHash(addr).Bytes(), gethTypes.EmptyCodeHash.Bytes()) } +// Touch accesses the specific account without returning anything. +func (db *StateDB) Touch(addr gethCommon.Address) { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) +} + // CreateAccount creates a new account for the given address // it sets the nonce to zero func (db *StateDB) CreateAccount(addr gethCommon.Address) { @@ -95,41 +116,41 @@ func (db *StateDB) IsCreated(addr gethCommon.Address) bool { // This operation sets the 'newContract'-flag, which is required in order to // correctly handle EIP-6780 'delete-in-same-transaction' logic. func (db *StateDB) CreateContract(addr gethCommon.Address) { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) db.latestView().CreateContract(addr) } -// IsCreated returns true if address is a new contract +// IsNewContract returns true if address is a new contract func (db *StateDB) IsNewContract(addr gethCommon.Address) bool { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) return db.latestView().IsNewContract(addr) } -// SelfDestruct flags the address for deletion and returns the previous balance. +// SelfDestruct flags the address for deletion. // // While this address exists for the rest of the transaction, // the balance of this account is cleared after the SelfDestruct call. -func (db *StateDB) SelfDestruct(addr gethCommon.Address) uint256.Int { - db.handleError(fmt.Errorf("legacy self destruct is not supported")) - return uint256.Int{} -} - -// SelfDestruct6780 would only follow the self destruct steps if account is a new contract -// either just created, or address had balance before but got a contract deployed to it (in this tx). -// Returns the previous balance and a boolean value denoting whether the address was self destructed. -func (db *StateDB) SelfDestruct6780(addr gethCommon.Address) (uint256.Int, bool) { - balance, err := db.latestView().GetBalance(addr) - db.handleError(err) - +func (db *StateDB) SelfDestruct(addr gethCommon.Address) { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) + + // Flow EVM went live with the Cancun hard-fork, so we only support the + // EIP-6780 SELFDESTRUCT variation, which works only in same transaction. + // EIP-6780 would only follow the self destruct steps if account is a new + // contract either just created, or address had balance before but got a + // contract deployed to it (in this tx). if db.IsNewContract(addr) { err := db.latestView().SelfDestruct(addr) db.handleError(err) - return *balance, true } - - return *balance, false } // HasSelfDestructed returns true if address is flagged with self destruct. func (db *StateDB) HasSelfDestructed(addr gethCommon.Address) bool { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) destructed, _ := db.latestView().HasSelfDestructed(addr) return destructed } @@ -141,6 +162,8 @@ func (db *StateDB) SubBalance( amount *uint256.Int, reason gethTracing.BalanceChangeReason, ) uint256.Int { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) // negative amounts are not accepted. if amount.Sign() < 0 { db.handleError(types.ErrInvalidBalance) @@ -162,6 +185,8 @@ func (db *StateDB) AddBalance( amount *uint256.Int, reason gethTracing.BalanceChangeReason, ) uint256.Int { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) // negative amounts are not accepted. if amount.Sign() < 0 { db.handleError(types.ErrInvalidBalance) @@ -178,6 +203,8 @@ func (db *StateDB) AddBalance( // GetBalance returns the balance of the given address func (db *StateDB) GetBalance(addr gethCommon.Address) *uint256.Int { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) bal, err := db.latestView().GetBalance(addr) db.handleError(err) return bal @@ -185,6 +212,8 @@ func (db *StateDB) GetBalance(addr gethCommon.Address) *uint256.Int { // GetNonce returns the nonce of the given address func (db *StateDB) GetNonce(addr gethCommon.Address) uint64 { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) nonce, err := db.latestView().GetNonce(addr) db.handleError(err) return nonce @@ -196,12 +225,16 @@ func (db *StateDB) SetNonce( nonce uint64, reason gethTracing.NonceChangeReason, ) { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) err := db.latestView().SetNonce(addr, nonce) db.handleError(err) } // GetCodeHash returns the code hash of the given address func (db *StateDB) GetCodeHash(addr gethCommon.Address) gethCommon.Hash { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) hash, err := db.latestView().GetCodeHash(addr) db.handleError(err) return hash @@ -209,6 +242,8 @@ func (db *StateDB) GetCodeHash(addr gethCommon.Address) gethCommon.Hash { // GetCode returns the code for the given address func (db *StateDB) GetCode(addr gethCommon.Address) []byte { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) code, err := db.latestView().GetCode(addr) db.handleError(err) return code @@ -216,6 +251,8 @@ func (db *StateDB) GetCode(addr gethCommon.Address) []byte { // GetCodeSize returns the size of the code for the given address func (db *StateDB) GetCodeSize(addr gethCommon.Address) int { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) codeSize, err := db.latestView().GetCodeSize(addr) db.handleError(err) return codeSize @@ -228,6 +265,8 @@ func (db *StateDB) SetCode( code []byte, reason gethTracing.CodeChangeReason, ) (prev []byte) { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) prev = db.GetCode(addr) err := db.latestView().SetCode(addr, code) db.handleError(err) @@ -255,6 +294,12 @@ func (db *StateDB) GetRefund() uint64 { // GetCommittedState returns the value for the given storage slot considering only the committed state and not // changes in the scope of current transaction. func (db *StateDB) GetCommittedState(addr gethCommon.Address, key gethCommon.Hash) gethCommon.Hash { + // Record slot access regardless of whether the storage slot exists. + if db.stateAccessList != nil { + db.stateAccessList.StorageRead(addr, key) + } + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) value, err := db.baseView.GetState(types.SlotAddress{Address: addr, Key: key}) db.handleError(err) return value @@ -265,6 +310,8 @@ func (db *StateDB) GetStateAndCommittedState( addr gethCommon.Address, key gethCommon.Hash, ) (gethCommon.Hash, gethCommon.Hash) { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) origin := db.GetCommittedState(addr, key) value := db.GetState(addr, key) @@ -273,7 +320,27 @@ func (db *StateDB) GetStateAndCommittedState( // GetState returns the value for the given storage slot func (db *StateDB) GetState(addr gethCommon.Address, key gethCommon.Hash) gethCommon.Hash { - state, err := db.latestView().GetState(types.SlotAddress{Address: addr, Key: key}) + sk := types.SlotAddress{Address: addr, Key: key} + + // Record slot access only for non-dirty slots, essentially only + // when falling back to committed state access. + if db.stateAccessList != nil { + dirty := false + for _, view := range db.views { + _, dirty = view.DirtySlots()[sk] + if dirty { + break + } + } + if !dirty { + db.stateAccessList.StorageRead(addr, key) + } + } + + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) + + state, err := db.latestView().GetState(sk) db.handleError(err) return state } @@ -293,6 +360,8 @@ func (db *StateDB) GetState(addr gethCommon.Address, key gethCommon.Hash) gethCo // This endpoint is added mostly to prevent the case that an smart contract is self-destructed // and a later transaction tries to deploy a contract to the same address. func (db *StateDB) GetStorageRoot(addr gethCommon.Address) gethCommon.Hash { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) root, err := db.latestView().GetStorageRoot(addr) db.handleError(err) return root @@ -305,6 +374,8 @@ func (db *StateDB) SetState( key gethCommon.Hash, value gethCommon.Hash, ) gethCommon.Hash { + // EIP-7928: per-transaction state access tracking + db.recordStateAccess(addr) prevState, err := db.latestView().SetState(types.SlotAddress{Address: addr, Key: key}, value) db.handleError(err) @@ -570,10 +641,120 @@ func (db *StateDB) Commit(finalize bool) (hash.Hash, error) { return updateCommit, nil } +// LogsForBurnAccounts returns the eth burn logs for accounts scheduled for +// removal which still have positive balance. The purpose of this function is +// to handle a corner case of EIP-7708 where a self-destructed account might +// still receive funds between sending/burning its previous balance and actual +// removal. In this case the burning of these remaining balances still need to +// be logged. +// Specification EIP-7708: https://eips.ethereum.org/EIPS/eip-7708 +// +// This function should only be invoked at the transaction boundary, specifically +// before the Finalise. +func (db *StateDB) LogsForBurnAccounts() []*gethTypes.Log { + // iterate views and collect dirty addresses + dirtyAddresses := make(map[gethCommon.Address]struct{}) + for _, view := range db.views { + for key := range view.DirtyAddresses() { + dirtyAddresses[key] = struct{}{} + } + } + + var list []removedAccountWithBalance + for addr := range dirtyAddresses { + hasSelfDestructed, balance := db.latestView().HasSelfDestructed(addr) + if hasSelfDestructed && !balance.IsZero() { + list = append(list, removedAccountWithBalance{ + address: addr, + balance: balance, + }) + } + } + if list == nil { + return nil + } + sort.Slice(list, func(i, j int) bool { + return list[i].address.Cmp(list[j].address) < 0 + }) + logs := make([]*gethTypes.Log, len(list)) + for i, acct := range list { + logs[i] = gethTypes.EthBurnLog(acct.address, acct.balance) + } + return logs +} + // This is a no-op for our custom implementation of the StateDB interface, // since Commit() already handles finalization and deletion of empty // objects. -func (db *StateDB) Finalise(deleteEmptyObjects bool) {} +func (db *StateDB) Finalise(deleteEmptyObjects bool) *gethBAL.ConstructionBlockAccessList { + // iterate views and collect dirty addresses and slots + dirtyAddresses := make(map[gethCommon.Address]struct{}) + dirtySlots := make(map[types.SlotAddress]gethCommon.Hash) + for _, view := range db.views { + for key := range view.DirtyAddresses() { + dirtyAddresses[key] = struct{}{} + } + for key, val := range view.DirtySlots() { + dirtySlots[key] = val + } + } + + for slot, value := range dirtySlots { + address := slot.Address + if db.HasSelfDestructed(address) || (deleteEmptyObjects && db.Empty(address)) { + continue + } + // Aggregate storage writes into the block-level access list. + // All slots in the dirtyStorage set must have post-transaction + // values that differ from their pre-transaction values. + if db.stateAccessList != nil { + db.stateAccessList.StorageWrite(db.blockAccessIndex, address, slot.Key, value) + } + } + + for addr := range dirtyAddresses { + if db.HasSelfDestructed(addr) || (deleteEmptyObjects && db.Empty(addr)) { + // Aggregate the account mutation into the block-level accessList + // if Amsterdam has been activated. + if db.stateAccessList != nil { + // Notably, if the account is deleted during the transaction, + // its pre-transaction nonce, code, and storage must be empty. + // + // EIP-6780 restricts self-destruct to contracts deployed within + // the same transaction, while EIP-7610 rejects deployments to + // destinations with non-empty storage, non-zero nonce and non-empty + // code. + // + // Therefore, when an account is deleted, its pre-transaction nonce + // code and storage is guaranteed to be empty, leaving nothing to + // clean up here. + balance := uint256.NewInt(0) + if db.balanceChange(addr, balance) { + db.stateAccessList.BalanceChange(db.blockAccessIndex, addr, balance) + } + } + } else { + // Aggregate the account mutation into the block-level accessList + // if Amsterdam has been activated. + if db.stateAccessList != nil { + balance := db.GetBalance(addr) + if db.balanceChange(addr, balance) { + db.stateAccessList.BalanceChange(db.blockAccessIndex, addr, balance) + } + nonce := db.GetNonce(addr) + if db.nonceChange(addr, nonce) { + db.stateAccessList.NonceChange(addr, db.blockAccessIndex, nonce) + } + code := db.GetCode(addr) + if db.codeChange(addr, code) { + db.stateAccessList.CodeChange(addr, db.blockAccessIndex, code) + } + } + } + } + + return db.stateAccessList +} // Finalize flushes all the changes // to the permanent storage @@ -606,6 +787,10 @@ func (db *StateDB) Prepare(rules gethParams.Rules, sender, coinbase gethCommon.A db.AddAddressToAccessList(coinbase) } } + + if rules.IsAmsterdam { + db.stateAccessList = gethBAL.NewConstructionBlockAccessList() + } } // Reset resets uncommitted changes and transient artifacts such as error, logs, @@ -614,6 +799,25 @@ func (db *StateDB) Prepare(rules gethParams.Rules, sender, coinbase gethCommon.A func (db *StateDB) Reset() { db.views = []*DeltaView{NewDeltaView(db.baseView)} db.cachedError = nil + // If Amsterdam is activated, we need to create a new state read list. + // This method is mainly used to reset the state between EVM.batchRun + // transactions. + if db.stateAccessList != nil { + db.stateAccessList = gethBAL.NewConstructionBlockAccessList() + } +} + +// SetTxContext sets the current transaction hash and index which are +// used when the EVM emits new state logs. It should be invoked before +// transaction execution. +func (s *StateDB) SetTxContext( + txHash gethCommon.Hash, + txIndex int, + blockAccessIndex uint32, +) { + // We are only interested in keeping `blockAccessIndex`, as logs are filled + // with tx info from the `StateDB.Logs(blockNumber, txHash, txIndex)` method. + s.blockAccessIndex = blockAccessIndex } // Error returns the memorized database failure occurred earlier. @@ -621,13 +825,6 @@ func (s *StateDB) Error() error { return wrapError(s.cachedError) } -// PointCache is not supported and only needed -// when EIP-4762 is enabled in the future versions -// (currently planned for after Verkle fork). -func (s *StateDB) PointCache() *gethUtils.PointCache { - return nil -} - // Witness is not supported and only needed // when if witness collection is enabled (EnableWitnessCollection flag). // By definition it should returns a set containing all trie nodes that have been accessed. @@ -644,10 +841,40 @@ func (s *StateDB) AccessEvents() *gethState.AccessEvents { return nil } +// recordStateAccess records state access regardless of whether the account exists. +func (db *StateDB) recordStateAccess(addr gethCommon.Address) { + // Amsterdam hard-fork not activated + if db.stateAccessList == nil { + return + } + db.stateAccessList.AccountRead(addr) +} + func (db *StateDB) latestView() *DeltaView { return db.views[len(db.views)-1] } +func (db *StateDB) balanceChange(addr gethCommon.Address, current *uint256.Int) bool { + balance, err := db.baseView.GetBalance(addr) + db.handleError(err) + + return balance.Cmp(current) != 0 +} + +func (db *StateDB) nonceChange(addr gethCommon.Address, current uint64) bool { + nonce, err := db.baseView.GetNonce(addr) + db.handleError(err) + + return nonce != current +} + +func (db *StateDB) codeChange(addr gethCommon.Address, current []byte) bool { + code, err := db.baseView.GetCode(addr) + db.handleError(err) + + return !bytes.Equal(code, current) +} + // set error captures the first non-nil error it is called with. func (db *StateDB) handleError(err error) { if err == nil { diff --git a/fvm/evm/emulator/state/stateDB_test.go b/fvm/evm/emulator/state/stateDB_test.go index c869979ede9..2f4d5a6f039 100644 --- a/fvm/evm/emulator/state/stateDB_test.go +++ b/fvm/evm/emulator/state/stateDB_test.go @@ -255,6 +255,7 @@ func TestStateDB(t *testing.T) { require.True(t, db.AddressInAccessList(sender)) require.True(t, db.AddressInAccessList(coinbase)) require.True(t, db.AddressInAccessList(dest)) + require.Nil(t, db.Finalise(true)) // no BAL unless Amsterdam is activated for _, add := range precompiles { require.True(t, db.AddressInAccessList(add)) @@ -267,6 +268,19 @@ func TestStateDB(t *testing.T) { require.True(t, slotFound) } } + + rules = gethParams.Rules{ + IsBerlin: true, + IsShanghai: true, + IsPrague: true, + IsOsaka: true, + IsAmsterdam: true, + } + + require.NoError(t, err) + db.Prepare(rules, sender, coinbase, &dest, precompiles, txAccesses) + + require.NotNil(t, db.Finalise(true)) // BAL should be present when Amsterdam is activated }) t.Run("test non-fatal error handling", func(t *testing.T) { @@ -370,7 +384,7 @@ func TestStateDB(t *testing.T) { require.NotEqual(t, gethTypes.EmptyRootHash, root) }) - t.Run("test Selfdestruct6780 functionality", func(t *testing.T) { + t.Run("test SelfDestruct functionality", func(t *testing.T) { ledger := testutils.GetSimpleValueStore() db, err := state.NewStateDB(ledger, rootAddr) require.NoError(t, err) @@ -391,12 +405,13 @@ func TestStateDB(t *testing.T) { db, err = state.NewStateDB(ledger, rootAddr) require.NoError(t, err) // call self destruct - db.SelfDestruct6780(addr1) + db.SelfDestruct(addr1) require.NoError(t, db.Error()) // noop is expected require.Equal(t, balance1, db.GetBalance(addr1)) require.Equal(t, code1, db.GetCode(addr1)) require.NoError(t, db.Error()) + require.Len(t, db.LogsForBurnAccounts(), 0) // test 2 - account exist before with some balance // but not a contract - selfdestruct should work @@ -412,7 +427,7 @@ func TestStateDB(t *testing.T) { db, err = state.NewStateDB(ledger, rootAddr) require.NoError(t, err) // call self destruct should not work - db.SelfDestruct6780(addr2) + db.SelfDestruct(addr2) require.NoError(t, db.Error()) // still no impact require.Equal(t, balance2, db.GetBalance(addr2)) @@ -429,8 +444,14 @@ func TestStateDB(t *testing.T) { db.CreateContract(addr2) require.Equal(t, code1, db.GetCode(addr2)) // now calling selfdestruct should do the job - db.SelfDestruct6780(addr2) + db.SelfDestruct(addr2) require.NoError(t, db.Error()) + burnLogs := db.LogsForBurnAccounts() + require.Len(t, burnLogs, 1) + ethBurnLog := burnLogs[0] + require.Equal(t, gethParams.EthBurnLogEvent, ethBurnLog.Topics[0]) + require.Equal(t, gethCommon.BytesToHash(addr2.Bytes()), ethBurnLog.Topics[1]) + commit, err = db.Commit(true) require.NoError(t, err) require.NotEmpty(t, commit) @@ -456,8 +477,14 @@ func TestStateDB(t *testing.T) { db.AddBalance(addr3, balance3, gethTracing.BalanceChangeTransfer) require.NoError(t, db.Error()) // call self destruct - db.SelfDestruct6780(addr3) + db.SelfDestruct(addr3) require.NoError(t, db.Error()) + burnLogs = db.LogsForBurnAccounts() + require.Len(t, burnLogs, 1) + ethBurnLog = burnLogs[0] + require.Equal(t, gethParams.EthBurnLogEvent, ethBurnLog.Topics[0]) + require.Equal(t, gethCommon.BytesToHash(addr3.Bytes()), ethBurnLog.Topics[1]) + // commit changes commit, err = db.Commit(true) require.NoError(t, err) @@ -472,4 +499,183 @@ func TestStateDB(t *testing.T) { require.Equal(t, gethCommon.Hash{}, db.GetState(addr3, key)) require.NoError(t, db.Error()) }) + + t.Run("test Finalise functionality", func(t *testing.T) { + ledger := testutils.GetSimpleValueStore() + db, err := state.NewStateDB(ledger, rootAddr) + require.NoError(t, err) + + sender := testutils.RandomCommonAddress(t) + coinbase := testutils.RandomCommonAddress(t) + dest := testutils.RandomCommonAddress(t) + precompiles := []gethCommon.Address{ + testutils.RandomCommonAddress(t), + testutils.RandomCommonAddress(t), + } + txAccesses := gethTypes.AccessList([]gethTypes.AccessTuple{ + {Address: testutils.RandomCommonAddress(t), + StorageKeys: []gethCommon.Hash{ + testutils.RandomCommonHash(t), + testutils.RandomCommonHash(t), + }, + }, + }) + rules := gethParams.Rules{ + IsBerlin: true, + IsShanghai: true, + IsAmsterdam: true, + } + + db.Prepare(rules, sender, coinbase, &dest, precompiles, txAccesses) + require.NoError(t, err) + + // Block access list should be empty initially + bal := db.Finalise(true) + require.Len(t, bal.Accounts, 0) + + // Block access list with balance change on EOA + addr1 := testutils.RandomCommonAddress(t) + balance := uint256.NewInt(5) + db.AddBalance(addr1, balance, gethTracing.BalanceChangeUnspecified) + require.NoError(t, db.Error()) + + bal = db.Finalise(true) + require.Len(t, bal.Accounts, 1) + require.Equal(t, balance, bal.Accounts[addr1].BalanceChanges[0]) + + // Block access list with nonce change on EOA + addr2 := testutils.RandomCommonAddress(t) + nonce := uint64(3) + db.SetNonce(addr2, nonce, gethTracing.NonceChangeContractCreator) + require.NoError(t, db.Error()) + + bal = db.Finalise(true) + require.Len(t, bal.Accounts, 2) + require.Equal(t, nonce, bal.Accounts[addr2].NonceChanges[0]) + + // Block access list with code change on contract creation + addr3 := testutils.RandomCommonAddress(t) + code := []byte{1, 2, 3} + db.SetCode(addr3, code, gethTracing.CodeChangeContractCreation) + require.NoError(t, db.Error()) + + bal = db.Finalise(true) + require.Len(t, bal.Accounts, 3) + require.Equal(t, code, bal.Accounts[addr3].CodeChange[0]) + + // Block access list with balance change to 0 on smart contract SelfDestruct + addr4 := testutils.RandomCommonAddress(t) + balance = uint256.NewInt(200) + db.CreateAccount(addr4) + db.AddBalance(addr4, balance, gethTracing.BalanceChangeTransfer) + require.NoError(t, db.Error()) + + // commit and renew db + commit, err := db.Commit(true) + require.NoError(t, err) + require.NotEmpty(t, commit) + db, err = state.NewStateDB(ledger, rootAddr) + require.NoError(t, err) + db.Prepare(rules, sender, coinbase, &dest, precompiles, txAccesses) + require.NoError(t, err) + + // set code and call contract creation + db.SetCode(addr4, code, gethTracing.CodeChangeContractCreation) + db.CreateContract(addr4) + require.Equal(t, code, db.GetCode(addr4)) + // now calling selfdestruct should do the job + db.SelfDestruct(addr4) + require.NoError(t, db.Error()) + + bal = db.Finalise(true) + require.Len(t, bal.Accounts, 1) + require.Equal(t, uint256.NewInt(0), bal.Accounts[addr4].BalanceChanges[0]) + + // Block access list with account read + addr5 := testutils.RandomCommonAddress(t) + db.GetBalance(addr5) + + bal = db.Finalise(true) + require.Len(t, bal.Accounts, 2) + require.NotNil(t, bal.Accounts[addr5]) + + // Block access list with unseen EOA in block transactions + addr6 := testutils.RandomCommonAddress(t) + require.Nil(t, bal.Accounts[addr6]) + + // Block access list with storage read from GetCommittedState() + db, err = state.NewStateDB(ledger, rootAddr) + require.NoError(t, err) + db.Prepare(rules, sender, coinbase, &dest, precompiles, txAccesses) + require.NoError(t, err) + + addr7 := testutils.RandomCommonAddress(t) + key1 := testutils.RandomCommonHash(t) + + db.CreateAccount(addr7) + require.NoError(t, db.Error()) + + db.GetCommittedState(addr7, key1) + require.NoError(t, db.Error()) + + bal = db.Finalise(true) + require.Len(t, bal.Accounts, 1) + require.Contains(t, bal.Accounts[addr7].StorageReads, key1) + + // Block access list with storage read on GetState() dirty slot + db, err = state.NewStateDB(ledger, rootAddr) + require.NoError(t, err) + db.Prepare(rules, sender, coinbase, &dest, precompiles, txAccesses) + require.NoError(t, err) + + addr8 := testutils.RandomCommonAddress(t) + value1 := testutils.RandomCommonHash(t) + + // should have code to be able to set state + db.SetCode(addr8, []byte{1, 2, 3}, gethTracing.CodeChangeContractCreation) + require.NoError(t, db.Error()) + + db.SetState(addr8, key1, value1) + require.NoError(t, db.Error()) + + db.GetState(addr8, key1) + require.NoError(t, db.Error()) + + bal = db.Finalise(true) + require.Len(t, bal.Accounts, 1) + require.NotContains(t, bal.Accounts[addr8].StorageReads, key1) + require.Equal(t, value1, bal.Accounts[addr8].StorageWrites[key1][0]) + + // Block access list with storage read on GetState() existing slot + db, err = state.NewStateDB(ledger, rootAddr) + require.NoError(t, err) + db.Prepare(rules, sender, coinbase, &dest, precompiles, txAccesses) + require.NoError(t, err) + + addr9 := testutils.RandomCommonAddress(t) + + // should have code to be able to set state + db.SetCode(addr9, []byte{1, 2, 3}, gethTracing.CodeChangeContractCreation) + require.NoError(t, db.Error()) + + db.SetState(addr9, key1, value1) + require.NoError(t, db.Error()) + + commit, err = db.Commit(true) + require.NoError(t, err) + require.NotEmpty(t, commit) + + db, err = state.NewStateDB(ledger, rootAddr) + require.NoError(t, err) + db.Prepare(rules, sender, coinbase, &dest, precompiles, txAccesses) + require.NoError(t, err) + + ret := db.GetState(addr9, key1) + require.NoError(t, db.Error()) + require.Equal(t, value1, ret) + + bal = db.Finalise(true) + require.Len(t, bal.Accounts, 1) + require.Contains(t, bal.Accounts[addr9].StorageReads, key1) + }) } diff --git a/fvm/evm/evm_test.go b/fvm/evm/evm_test.go index f7f89778bdd..b7feeeec464 100644 --- a/fvm/evm/evm_test.go +++ b/fvm/evm/evm_test.go @@ -28,6 +28,7 @@ import ( envMock "github.com/onflow/flow-go/fvm/environment/mock" "github.com/onflow/flow-go/fvm/evm" "github.com/onflow/flow-go/fvm/evm/events" + "github.com/onflow/flow-go/fvm/evm/handler" "github.com/onflow/flow-go/fvm/evm/impl" "github.com/onflow/flow-go/fvm/evm/stdlib" . "github.com/onflow/flow-go/fvm/evm/testutils" @@ -82,7 +83,7 @@ func TestEVMRun(t *testing.T) { testContract.DeployedAt.ToCommon(), testContract.MakeCallData(t, "store", big.NewInt(num)), big.NewInt(0), - uint64(100_000), + uint64(125_000), big.NewInt(1), ) @@ -126,7 +127,7 @@ func TestEVMRun(t *testing.T) { require.NoError(t, err) require.Equal(t, uint16(types.ErrCodeNoError), feeTranferEventPayload.ErrorCode) require.Equal(t, uint16(1), feeTranferEventPayload.Index) - require.Equal(t, uint64(21000), feeTranferEventPayload.GasConsumed) + require.Equal(t, uint64(204_600), feeTranferEventPayload.GasConsumed) // commit block blockEventPayload, snapshot := callEVMHeartBeat(t, @@ -135,7 +136,7 @@ func TestEVMRun(t *testing.T) { snapshot) require.NotEmpty(t, blockEventPayload.Hash) - require.Equal(t, uint64(64785), blockEventPayload.TotalGasUsed) + require.Equal(t, uint64(329_205), blockEventPayload.TotalGasUsed) require.NotEmpty(t, blockEventPayload.Hash) txHashes := types.TransactionHashes{txEventPayload.Hash, feeTranferEventPayload.Hash} @@ -235,7 +236,7 @@ func TestEVMRun(t *testing.T) { from: EVM.addressFromString(from), to: EVM.addressFromString(to), data: data, - gasLimit: 100_000, + gasLimit: 125_000, value: EVM.Balance(attoflow: 0) ) @@ -296,7 +297,7 @@ func TestEVMRun(t *testing.T) { ) require.NotEmpty(t, blockEventPayload.Hash) - require.Equal(t, uint64(43785), blockEventPayload.TotalGasUsed) + require.Equal(t, uint64(124_605), blockEventPayload.TotalGasUsed) require.NotEmpty(t, blockEventPayload.Hash) require.Equal(t, uint16(types.ErrCodeNoError), txEventPayload.ErrorCode) @@ -309,7 +310,7 @@ func TestEVMRun(t *testing.T) { require.Equal(t, fromAddress, directCall.From.String()) require.Equal(t, testContract.DeployedAt.String(), directCall.To.String()) - require.Equal(t, uint64(100_000), directCall.GasLimit) + require.Equal(t, uint64(125_000), directCall.GasLimit) }, fvm.WithEVMTestHelpersEnabled(true), ) @@ -923,7 +924,7 @@ func TestEVMRun(t *testing.T) { testContract.DeployedAt.ToCommon(), testContract.MakeCallData(t, "storeButRevert", big.NewInt(num)), big.NewInt(0), - uint64(100_000), + uint64(125_000), big.NewInt(0), ) @@ -1035,7 +1036,7 @@ func TestEVMRun(t *testing.T) { testContract.DeployedAt.ToCommon(), testContract.MakeCallData(t, "storeWithLog", big.NewInt(num)), big.NewInt(0), - uint64(100_000), + uint64(155_000), big.NewInt(0), ) @@ -1255,7 +1256,7 @@ func TestEVMRun(t *testing.T) { ) }) - t.Run("testing EVM.run failed with gas limit validation error", func(t *testing.T) { + t.Run("testing EVM.run with higher gas limit cap under Amsterdam", func(t *testing.T) { t.Parallel() RunWithNewEnvironment(t, @@ -1274,9 +1275,8 @@ func TestEVMRun(t *testing.T) { prepare(account: &Account) { let coinbase = EVM.EVMAddress(bytes: coinbaseBytes) let res = EVM.run(tx: tx, coinbase: coinbase) - assert(res.status == EVM.Status.invalid, message: "unexpected status") - assert(res.errorCode == 100, message: "unexpected error code: \(res.errorCode)") - assert(res.errorMessage == "transaction gas limit too high (cap: 16777216, tx: 16777220)") + assert(res.status == EVM.Status.successful, message: "unexpected status") + assert(res.errorCode == 0, message: "unexpected error code: \(res.errorCode)") } } `, @@ -1323,9 +1323,42 @@ func TestEVMRun(t *testing.T) { require.NoError(t, err) require.NoError(t, output.Err) require.NotEmpty(t, state.WriteSet) + snapshot = snapshot.Append(state) - // assert no events were produced from an invalid EVM transaction - require.Len(t, output.Events, 0) + // assert event fields are correct + require.Len(t, output.Events, 2) + txEvent := output.Events[0] + txEventPayload := TxEventToPayload(t, txEvent, sc.EVMContract.Address) + require.NoError(t, err) + + // fee transfer event + feeTransferEvent := output.Events[1] + feeTranferEventPayload := TxEventToPayload(t, feeTransferEvent, sc.EVMContract.Address) + require.NoError(t, err) + require.Equal(t, uint16(types.ErrCodeNoError), feeTranferEventPayload.ErrorCode) + require.Equal(t, uint16(1), feeTranferEventPayload.Index) + require.Equal(t, uint64(204_600), feeTranferEventPayload.GasConsumed) + + // commit block + blockEventPayload, _ := callEVMHeartBeat(t, ctx, vm, snapshot) + + require.NotEmpty(t, blockEventPayload.Hash) + require.Equal(t, uint64(329_205), blockEventPayload.TotalGasUsed) + require.NotEmpty(t, blockEventPayload.Hash) + + txHashes := types.TransactionHashes{txEventPayload.Hash, feeTranferEventPayload.Hash} + require.Equal(t, + txHashes.RootHash(), + blockEventPayload.TransactionHashRoot, + ) + require.NotEmpty(t, blockEventPayload.ReceiptRoot) + + require.Equal(t, innerTxBytes, txEventPayload.Payload) + require.Equal(t, uint16(types.ErrCodeNoError), txEventPayload.ErrorCode) + require.Equal(t, uint16(0), txEventPayload.Index) + require.Equal(t, blockEventPayload.Height, txEventPayload.BlockHeight) + require.Equal(t, blockEventPayload.TotalGasUsed-feeTranferEventPayload.GasConsumed, txEventPayload.GasConsumed) + require.Empty(t, txEventPayload.ContractAddress) }) }) @@ -1410,7 +1443,7 @@ func TestEVMRun(t *testing.T) { require.NoError(t, err) require.Equal(t, uint16(types.ErrCodeNoError), feeTranferEventPayload.ErrorCode) require.Equal(t, uint16(1), feeTranferEventPayload.Index) - require.Equal(t, uint64(21000), feeTranferEventPayload.GasConsumed) + require.Equal(t, uint64(204_600), feeTranferEventPayload.GasConsumed) // commit block blockEventPayload, _ := callEVMHeartBeat(t, @@ -1420,7 +1453,7 @@ func TestEVMRun(t *testing.T) { ) require.NotEmpty(t, blockEventPayload.Hash) - require.Equal(t, uint64(64785), blockEventPayload.TotalGasUsed) + require.Equal(t, uint64(329_205), blockEventPayload.TotalGasUsed) require.NotEmpty(t, blockEventPayload.Hash) txHashes := types.TransactionHashes{txEventPayload.Hash, feeTranferEventPayload.Hash} @@ -1492,7 +1525,7 @@ func TestEVMBatchRun(t *testing.T) { testContract.DeployedAt.ToCommon(), testContract.MakeCallData(t, "storeWithLog", big.NewInt(num)), big.NewInt(0), - uint64(100_000), + uint64(135_000), big.NewInt(1), ) @@ -1565,7 +1598,7 @@ func TestEVMBatchRun(t *testing.T) { require.NoError(t, err) require.Equal(t, uint16(types.ErrCodeNoError), feeTranferEventPayload.ErrorCode) require.Equal(t, uint16(batchCount), feeTranferEventPayload.Index) - require.Equal(t, uint64(21000), feeTranferEventPayload.GasConsumed) + require.Equal(t, uint64(204_600), feeTranferEventPayload.GasConsumed) txHashes = append(txHashes, feeTranferEventPayload.Hash) // check coinbase balance (note the gas price is 1) @@ -1579,7 +1612,7 @@ func TestEVMBatchRun(t *testing.T) { snapshot) require.NotEmpty(t, blockEventPayload.Hash) - require.Equal(t, uint64(176_513), blockEventPayload.TotalGasUsed) + require.Equal(t, uint64(440_933), blockEventPayload.TotalGasUsed) require.Equal(t, txHashes.RootHash(), blockEventPayload.TransactionHashRoot, @@ -1690,7 +1723,7 @@ func TestEVMBatchRun(t *testing.T) { testContract.DeployedAt.ToCommon(), testContract.MakeCallData(t, "store", big.NewInt(num)), big.NewInt(0), - uint64(100_000), + uint64(125_000), big.NewInt(0), ) @@ -1805,11 +1838,11 @@ func TestEVMBatchRun(t *testing.T) { for i, res in batchResults { if i %% 2 != 0 { - assert(res.status == EVM.Status.successful, message: "unexpected success status") + assert(res.status == EVM.Status.successful, message: "\(res.errorMessage)") assert(res.errorCode == 0, message: "unexpected error code") assert(res.errorMessage == "", message: "unexpected error msg") } else { - assert(res.status == EVM.Status.failed, message: "unexpected failed status") + assert(res.status == EVM.Status.failed, message: "\(res.errorMessage)") assert(res.errorCode == 400, message: "unexpected error code") } } @@ -1822,11 +1855,11 @@ func TestEVMBatchRun(t *testing.T) { batchCount := 6 var num int64 txBytes := make([]cadence.Value, batchCount) - for i := 0; i < batchCount; i++ { - gas := uint64(100_000) + for i := range batchCount { + gas := uint64(125_000) if i%2 == 0 { // fail with too low gas limit - gas = 22_000 + gas = 23_500 } else { // update number with only valid transactions num = int64(i) @@ -1870,7 +1903,7 @@ func TestEVMBatchRun(t *testing.T) { require.NoError(t, err) require.NoError(t, output.Err) - //require.NotEmpty(t, state.WriteSet) + require.NotEmpty(t, state.WriteSet) // append the state snapshot = snapshot.Append(state) @@ -2072,10 +2105,11 @@ func TestEVMBlockData(t *testing.T) { } func TestEVMAddressDeposit(t *testing.T) { - t.Parallel() + chain := flow.Emulator.Chain() sc := systemcontracts.SystemContractsForChain(chain.ChainID()) + RunWithNewEnvironment(t, chain, func( ctx fvm.Context, @@ -2108,6 +2142,8 @@ func TestEVMAddressDeposit(t *testing.T) { sc.FlowToken.Address.HexWithPrefix(), )) + addressAllocator := handler.NewAddressAllocator() + bridgeAddress := addressAllocator.NativeTokenBridgeAddress() addr := RandomAddress(t) txBody, err := flow.NewTransactionBodyBuilder(). @@ -2138,6 +2174,20 @@ func TestEVMAddressDeposit(t *testing.T) { // tx executed event txEvent := output.Events[2] txEventPayload := TxEventToPayload(t, txEvent, sc.EVMContract.Address) + require.Greater(t, len(txEventPayload.Logs), 0) + + gethLogs := []*gethTypes.Log{} + err = rlp.Decode(bytes.NewReader(txEventPayload.Logs), &gethLogs) + require.NoError(t, err) + require.Len(t, gethLogs, 1) + + ethTransferLog := gethLogs[0] + require.Equal(t, gethParams.SystemAddress, ethTransferLog.Address) + require.Len(t, ethTransferLog.Topics, 3) + require.Equal(t, gethParams.EthTransferLogEvent, ethTransferLog.Topics[0]) + require.Equal(t, common.BytesToHash(bridgeAddress.Bytes()), ethTransferLog.Topics[1]) + require.Equal(t, common.BytesToHash(addr.Bytes()), ethTransferLog.Topics[2]) + require.Equal(t, big.NewInt(1_000_000_000_000_000_000), new(big.Int).SetBytes(ethTransferLog.Data)) // deposit event depositEvent := output.Events[3] @@ -2156,14 +2206,100 @@ func TestEVMAddressDeposit(t *testing.T) { snapshot) require.NotEmpty(t, blockEventPayload.Hash) - require.Equal(t, uint64(21000), blockEventPayload.TotalGasUsed) + require.Equal(t, uint64(204_600), blockEventPayload.TotalGasUsed) txHashes := types.TransactionHashes{txEventPayload.Hash} require.Equal(t, txHashes.RootHash(), blockEventPayload.TransactionHashRoot, ) - }) + }, + ) +} + +func TestEOAStateAccountCreationCost(t *testing.T) { + t.Parallel() + + chain := flow.Emulator.Chain() + sc := systemcontracts.SystemContractsForChain(chain.ChainID()) + + RunWithNewEnvironment(t, + chain, func( + ctx fvm.Context, + vm fvm.VM, + snapshot snapshot.SnapshotTree, + testContract *TestContract, + testAccount *EOATestAccount, + ) { + code := fmt.Appendf(nil, + ` + import EVM from %s + import FlowToken from %s + + transaction(addr: [UInt8; 20]) { + prepare(account: auth(BorrowValue) &Account) { + let admin = account.storage + .borrow<&FlowToken.Administrator>(from: /storage/flowTokenAdmin)! + + let minter <- admin.createNewMinter(allowedAmount: 1.0) + let vault1 <- minter.mintTokens(amount: 0.5) + + let address = EVM.EVMAddress(bytes: addr) + address.deposit(from: <-vault1) + + let vault2 <- minter.mintTokens(amount: 0.5) + address.deposit(from: <-vault2) + + destroy minter + } + } + `, + sc.EVMContract.Address.HexWithPrefix(), + sc.FlowToken.Address.HexWithPrefix(), + ) + + addr := RandomAddress(t) + + txBody, err := flow.NewTransactionBodyBuilder(). + SetScript(code). + SetPayer(sc.FlowServiceAccount.Address). + AddAuthorizer(sc.FlowServiceAccount.Address). + AddArgument(json.MustEncode(cadence.NewArray( + unittest.BytesToCdcUInt8(addr.Bytes()), + ).WithType(stdlib.EVMAddressBytesCadenceType))). + Build() + require.NoError(t, err) + + tx := fvm.Transaction(txBody, 0) + + execSnap, output, err := vm.Run( + ctx, + tx, + snapshot) + require.NoError(t, err) + require.NoError(t, output.Err) + + snapshot = snapshot.Append(execSnap) + + expectedBalance := types.OneFlowBalance() + bal := getEVMAccountBalance(t, ctx, vm, snapshot, addr) + require.Equal(t, expectedBalance, bal) + + // 1st deposit + txEvent := output.Events[2] + txEventPayload := TxEventToPayload(t, txEvent, sc.EVMContract.Address) + // The 1st deposit also creates the fresh EOA, so the gas consumed + // reflects that. + require.Equal(t, uint64(204_600), txEventPayload.GasConsumed) + + // 2nd deposit + txEvent = output.Events[5] + txEventPayload = TxEventToPayload(t, txEvent, sc.EVMContract.Address) + // The 2nd deposit only operates on an existing EOA, so the gas + // consumed reflects a plain value transfer. + require.Equal(t, uint64(21_000), txEventPayload.GasConsumed) + }, + ) } func TestCOAAddressDeposit(t *testing.T) { @@ -2214,6 +2350,76 @@ func TestCOAAddressDeposit(t *testing.T) { }) } +func TestCOAStateAccountCreationCost(t *testing.T) { + t.Parallel() + + chain := flow.Emulator.Chain() + sc := systemcontracts.SystemContractsForChain(chain.ChainID()) + RunWithNewEnvironment(t, + chain, func( + ctx fvm.Context, + vm fvm.VM, + snapshot snapshot.SnapshotTree, + testContract *TestContract, + testAccount *EOATestAccount, + ) { + code := fmt.Appendf(nil, + ` + import EVM from %s + import FlowToken from %s + + transaction(addr: [UInt8; 20]) { + prepare(account: auth(BorrowValue) &Account) { + let admin = account.storage + .borrow<&FlowToken.Administrator>(from: /storage/flowTokenAdmin)! + + let minter <- admin.createNewMinter(allowedAmount: 1.0) + let vault <- minter.mintTokens(amount: 1.0) + + let coa <- EVM.createCadenceOwnedAccount() + coa.deposit(from: <-vault) + + destroy minter + destroy coa + } + } + `, + sc.EVMContract.Address.HexWithPrefix(), + sc.FlowToken.Address.HexWithPrefix(), + ) + + addr := RandomAddress(t) + + txBody, err := flow.NewTransactionBodyBuilder(). + SetScript(code). + SetPayer(sc.FlowServiceAccount.Address). + AddAuthorizer(sc.FlowServiceAccount.Address). + AddArgument(json.MustEncode(cadence.NewArray( + unittest.BytesToCdcUInt8(addr.Bytes()), + ).WithType(stdlib.EVMAddressBytesCadenceType))). + Build() + require.NoError(t, err) + + tx := fvm.Transaction(txBody, 0) + + _, output, err := vm.Run(ctx, tx, snapshot) + require.NoError(t, err) + require.NoError(t, output.Err) + + txEvent := output.Events[2] + txEventPayload := TxEventToPayload(t, txEvent, sc.EVMContract.Address) + // The 1st tx creates a fresh COA, so the gas consumed reflects the + // contract deployment. + require.Equal(t, uint64(5_375_550), txEventPayload.GasConsumed) + + txEvent = output.Events[4] + txEventPayload = TxEventToPayload(t, txEvent, sc.EVMContract.Address) + // The deposit only operates on an existing COA, so the gas + // consumed reflects a plain value transfer. + require.Equal(t, uint64(21_055), txEventPayload.GasConsumed) + }) +} + func TestCadenceOwnedAccountFunctionalities(t *testing.T) { t.Parallel() chain := flow.Emulator.Chain() @@ -2704,51 +2910,127 @@ func TestCadenceOwnedAccountFunctionalities(t *testing.T) { ) { code := []byte(fmt.Sprintf( ` - import EVM from %s - import FlowToken from %s + import EVM from %s + import FlowToken from %s - access(all) - fun main(address: [UInt8; 20]): UFix64 { - let admin = getAuthAccount(%s) - .storage.borrow<&FlowToken.Administrator>(from: /storage/flowTokenAdmin)! + transaction(address: [UInt8; 20]) { + prepare(account: auth(BorrowValue) &Account) { + let admin = account.storage.borrow<&FlowToken.Administrator>( + from: /storage/flowTokenAdmin + )! - let minter <- admin.createNewMinter(allowedAmount: 2.34) - let vault <- minter.mintTokens(amount: 2.34) - destroy minter + let minter <- admin.createNewMinter(allowedAmount: 2.34) + let vault <- minter.mintTokens(amount: 2.34) + destroy minter - let cadenceOwnedAccount <- EVM.createCadenceOwnedAccount() - cadenceOwnedAccount.deposit(from: <-vault) + let cadenceOwnedAccount <- EVM.createCadenceOwnedAccount() + cadenceOwnedAccount.deposit(from: <-vault) - let bal = EVM.Balance(attoflow: 0) - bal.setFLOW(flow: 1.23) + let bal = EVM.Balance(attoflow: 0) + bal.setFLOW(flow: 1.23) - let recipientEVMAddress = EVM.EVMAddress(bytes: address) + let recipientEVMAddress = EVM.EVMAddress(bytes: address) - let res = cadenceOwnedAccount.call( - to: recipientEVMAddress, - data: [], - gasLimit: 100_000, - value: bal, - ) + let res = cadenceOwnedAccount.call( + to: recipientEVMAddress, + data: [], + gasLimit: 204_600, + value: bal, + ) - assert(res.status == EVM.Status.successful, message: "transfer call was not successful") + assert(res.status == EVM.Status.successful, message: "transfer call was not successful") - destroy cadenceOwnedAccount - return recipientEVMAddress.balance().inFLOW() - } - `, + destroy cadenceOwnedAccount + } + } + `, sc.EVMContract.Address.HexWithPrefix(), sc.FlowToken.Address.HexWithPrefix(), - sc.FlowServiceAccount.Address.HexWithPrefix(), )) - addr := cadence.NewArray( - unittest.BytesToCdcUInt8(RandomAddress(t).Bytes()), + addr := RandomAddress(t) + addrBytes := cadence.NewArray( + unittest.BytesToCdcUInt8(addr.Bytes()), ).WithType(stdlib.EVMAddressBytesCadenceType) - script := fvm.Script(code).WithArguments( - json.MustEncode(addr), - ) + txBody, err := flow.NewTransactionBodyBuilder(). + SetScript(code). + SetPayer(sc.FlowServiceAccount.Address). + AddAuthorizer(sc.FlowServiceAccount.Address). + AddArgument(json.MustEncode(addrBytes)). + Build() + require.NoError(t, err) + tx := fvm.Transaction(txBody, 0) + + _, output, err := vm.Run(ctx, tx, snapshot) + require.NoError(t, err) + require.NoError(t, output.Err) + + // tx executed events + coaAddress, err := types.COAAddressFromFlowCOACreatedEvent(sc.EVMContract.Address, output.Events[3]) + require.NoError(t, err) + + coaDepositEvent := TxEventToPayload(t, output.Events[6], sc.EVMContract.Address) + require.Greater(t, len(coaDepositEvent.Logs), 0) + + gethLogs := []*gethTypes.Log{} + err = rlp.Decode(bytes.NewReader(coaDepositEvent.Logs), &gethLogs) + require.NoError(t, err) + require.Len(t, gethLogs, 1) + + ethTransferLog := gethLogs[0] + require.Equal(t, gethParams.SystemAddress, ethTransferLog.Address) + require.Len(t, ethTransferLog.Topics, 3) + require.Equal(t, gethParams.EthTransferLogEvent, ethTransferLog.Topics[0]) + require.Equal(t, common.BytesToHash(coaAddress.Bytes()), ethTransferLog.Topics[1]) + require.Equal(t, common.BytesToHash(addr.Bytes()), ethTransferLog.Topics[2]) + require.Equal(t, big.NewInt(1_230_000_000_000_000_000), new(big.Int).SetBytes(ethTransferLog.Data)) + }, + ) + }) + + t.Run("test coa deposit and withdraw in a single transaction", func(t *testing.T) { + RunWithNewEnvironment(t, + chain, func( + ctx fvm.Context, + vm fvm.VM, + snapshot snapshot.SnapshotTree, + testContract *TestContract, + testAccount *EOATestAccount, + ) { + code := []byte(fmt.Sprintf( + ` + import EVM from %s + import FlowToken from %s + + access(all) + fun main(): UFix64 { + let admin = getAuthAccount(%s) + .storage.borrow<&FlowToken.Administrator>(from: /storage/flowTokenAdmin)! + + let minter <- admin.createNewMinter(allowedAmount: 2.34) + let vault <- minter.mintTokens(amount: 2.34) + destroy minter + + let cadenceOwnedAccount <- EVM.createCadenceOwnedAccount() + cadenceOwnedAccount.deposit(from: <-vault) + + let bal = EVM.Balance(attoflow: 0) + bal.setFLOW(flow: 1.23) + let vault2 <- cadenceOwnedAccount.withdraw(balance: bal) + let balance = vault2.balance + destroy cadenceOwnedAccount + destroy vault2 + + return balance + } + `, + sc.EVMContract.Address.HexWithPrefix(), + sc.FlowToken.Address.HexWithPrefix(), + sc.FlowServiceAccount.Address.HexWithPrefix(), + )) + + script := fvm.Script(code) _, output, err := vm.Run( ctx, @@ -2756,12 +3038,12 @@ func TestCadenceOwnedAccountFunctionalities(t *testing.T) { snapshot) require.NoError(t, err) require.NoError(t, output.Err) - - require.Equal(t, uint64(123000000), uint64(output.Value.(cadence.UFix64))) }) }) - t.Run("test coa deposit and withdraw in a single transaction", func(t *testing.T) { + t.Run("test coa deploy", func(t *testing.T) { + t.Parallel() + RunWithNewEnvironment(t, chain, func( ctx fvm.Context, @@ -2772,48 +3054,92 @@ func TestCadenceOwnedAccountFunctionalities(t *testing.T) { ) { code := []byte(fmt.Sprintf( ` - import EVM from %s - import FlowToken from %s + import EVM from %s + import FlowToken from %s - access(all) - fun main(): UFix64 { - let admin = getAuthAccount(%s) - .storage.borrow<&FlowToken.Administrator>(from: /storage/flowTokenAdmin)! + transaction() { + prepare(account: auth(BorrowValue) &Account) { + let admin = account.storage.borrow<&FlowToken.Administrator>( + from: /storage/flowTokenAdmin + )! - let minter <- admin.createNewMinter(allowedAmount: 2.34) - let vault <- minter.mintTokens(amount: 2.34) - destroy minter + let minter <- admin.createNewMinter(allowedAmount: 2.34) + let vault <- minter.mintTokens(amount: 2.34) + destroy minter + + let cadenceOwnedAccount <- EVM.createCadenceOwnedAccount() + cadenceOwnedAccount.deposit(from: <-vault) + + let bal = EVM.Balance(attoflow: 0) + bal.setFLOW(flow: 1.23) + let vault2 <- cadenceOwnedAccount.withdraw(balance: bal) + let balance = vault2.balance + destroy cadenceOwnedAccount + destroy vault2 + } + } + `, + sc.EVMContract.Address.HexWithPrefix(), + sc.FlowToken.Address.HexWithPrefix(), + )) + + txBody, err := flow.NewTransactionBodyBuilder(). + SetScript(code). + SetPayer(sc.FlowServiceAccount.Address). + AddAuthorizer(sc.FlowServiceAccount.Address). + Build() + require.NoError(t, err) + tx := fvm.Transaction(txBody, 0) + + _, output, err := vm.Run(ctx, tx, snapshot) + require.NoError(t, err) + require.NoError(t, output.Err) + + addressAllocator := handler.NewAddressAllocator() + bridgeAddress := addressAllocator.NativeTokenBridgeAddress() + + // tx executed events + coaAddress, err := types.COAAddressFromFlowCOACreatedEvent(sc.EVMContract.Address, output.Events[3]) + require.NoError(t, err) - let cadenceOwnedAccount <- EVM.createCadenceOwnedAccount() - cadenceOwnedAccount.deposit(from: <-vault) + coaDepositEvent := TxEventToPayload(t, output.Events[4], sc.EVMContract.Address) + require.Greater(t, len(coaDepositEvent.Logs), 0) - let bal = EVM.Balance(attoflow: 0) - bal.setFLOW(flow: 1.23) - let vault2 <- cadenceOwnedAccount.withdraw(balance: bal) - let balance = vault2.balance - destroy cadenceOwnedAccount - destroy vault2 + gethLogs := []*gethTypes.Log{} + err = rlp.Decode(bytes.NewReader(coaDepositEvent.Logs), &gethLogs) + require.NoError(t, err) + require.Len(t, gethLogs, 1) - return balance - } - `, - sc.EVMContract.Address.HexWithPrefix(), - sc.FlowToken.Address.HexWithPrefix(), - sc.FlowServiceAccount.Address.HexWithPrefix(), - )) + ethTransferLog := gethLogs[0] + require.Equal(t, gethParams.SystemAddress, ethTransferLog.Address) + require.Len(t, ethTransferLog.Topics, 3) + require.Equal(t, gethParams.EthTransferLogEvent, ethTransferLog.Topics[0]) + require.Equal(t, common.BytesToHash(bridgeAddress.Bytes()), ethTransferLog.Topics[1]) + require.Equal(t, common.BytesToHash(coaAddress.Bytes()), ethTransferLog.Topics[2]) + require.Equal(t, big.NewInt(2_340_000_000_000_000_000), new(big.Int).SetBytes(ethTransferLog.Data)) - script := fvm.Script(code) + coaWithdrawEvent := TxEventToPayload(t, output.Events[6], sc.EVMContract.Address) + require.Greater(t, len(coaWithdrawEvent.Logs), 0) - _, output, err := vm.Run( - ctx, - script, - snapshot) + gethLogs = []*gethTypes.Log{} + err = rlp.Decode(bytes.NewReader(coaWithdrawEvent.Logs), &gethLogs) require.NoError(t, err) - require.NoError(t, output.Err) - }) + require.Len(t, gethLogs, 1) + + ethTransferLog = gethLogs[0] + require.Equal(t, gethParams.SystemAddress, ethTransferLog.Address) + require.Len(t, ethTransferLog.Topics, 3) + require.Equal(t, gethParams.EthTransferLogEvent, ethTransferLog.Topics[0]) + require.Equal(t, common.BytesToHash(coaAddress.Bytes()), ethTransferLog.Topics[1]) + require.Equal(t, common.BytesToHash(bridgeAddress.Bytes()), ethTransferLog.Topics[2]) + require.Equal(t, big.NewInt(1_230_000_000_000_000_000), new(big.Int).SetBytes(ethTransferLog.Data)) + }, + ) }) t.Run("test coa deploy", func(t *testing.T) { + t.Parallel() + RunWithNewEnvironment(t, chain, func( ctx fvm.Context, @@ -2822,59 +3148,82 @@ func TestCadenceOwnedAccountFunctionalities(t *testing.T) { testContract *TestContract, testAccount *EOATestAccount, ) { - code := []byte(fmt.Sprintf( + code := fmt.Appendf(nil, ` import EVM from %s import FlowToken from %s - access(all) - fun main(code: [UInt8]): EVM.Result { - let admin = getAuthAccount(%s) - .storage.borrow<&FlowToken.Administrator>(from: /storage/flowTokenAdmin)! - let minter <- admin.createNewMinter(allowedAmount: 2.34) - let vault <- minter.mintTokens(amount: 2.34) - destroy minter + transaction(code: [UInt8]) { + prepare(account: auth(BorrowValue) &Account) { + let admin = account.storage.borrow<&FlowToken.Administrator>( + from: /storage/flowTokenAdmin + )! - let cadenceOwnedAccount <- EVM.createCadenceOwnedAccount() - cadenceOwnedAccount.deposit(from: <-vault) + let minter <- admin.createNewMinter(allowedAmount: 2.34) + let vault <- minter.mintTokens(amount: 2.34) + destroy minter - let res = cadenceOwnedAccount.deploy( - code: code, - gasLimit: 2_000_000, - value: EVM.Balance(attoflow: 1230000000000000000) - ) - destroy cadenceOwnedAccount - return res + let cadenceOwnedAccount <- EVM.createCadenceOwnedAccount() + cadenceOwnedAccount.deposit(from: <-vault) + + let res = cadenceOwnedAccount.deploy( + code: code, + gasLimit: 10_500_000, + value: EVM.Balance(attoflow: 1230000000000000000) + ) + destroy cadenceOwnedAccount + } } `, sc.EVMContract.Address.HexWithPrefix(), sc.FlowToken.Address.HexWithPrefix(), - sc.FlowServiceAccount.Address.HexWithPrefix(), - )) + ) - script := fvm.Script(code). - WithArguments(json.MustEncode( + txBody, err := flow.NewTransactionBodyBuilder(). + SetScript(code). + SetPayer(sc.FlowServiceAccount.Address). + AddAuthorizer(sc.FlowServiceAccount.Address). + AddArgument(json.MustEncode( cadence.NewArray( unittest.BytesToCdcUInt8(testContract.ByteCode), ).WithType(cadence.NewVariableSizedArrayType(cadence.UInt8Type)), - )) + )). + Build() + require.NoError(t, err) + tx := fvm.Transaction(txBody, 0) - _, output, err := vm.Run( - ctx, - script, - snapshot) + _, output, err := vm.Run(ctx, tx, snapshot) require.NoError(t, err) require.NoError(t, output.Err) - res, err := impl.ResultSummaryFromEVMResultValue(output.Value) + // tx executed events + coaAddress, err := types.COAAddressFromFlowCOACreatedEvent(sc.EVMContract.Address, output.Events[3]) require.NoError(t, err) - require.Equal(t, types.StatusSuccessful, res.Status) - require.Equal(t, types.ErrCodeNoError, res.ErrorCode) - require.Empty(t, res.ErrorMessage) - require.NotNil(t, res.DeployedContractAddress) + + coaDeployEvent := TxEventToPayload(t, output.Events[6], sc.EVMContract.Address) + require.Greater(t, len(coaDeployEvent.Logs), 0) + require.Equal(t, uint16(0), coaDeployEvent.ErrorCode) + require.Empty(t, coaDeployEvent.ErrorMessage) + require.NotNil(t, coaDeployEvent.ContractAddress) // we strip away first few bytes because they contain deploy code - require.Equal(t, testContract.ByteCode[17:], []byte(res.ReturnedData)) - }) + require.Equal(t, testContract.ByteCode[17:], []byte(coaDeployEvent.ReturnedData)) + + contractAddress := common.HexToAddress(coaDeployEvent.ContractAddress) + + gethLogs := []*gethTypes.Log{} + err = rlp.Decode(bytes.NewReader(coaDeployEvent.Logs), &gethLogs) + require.NoError(t, err) + require.Len(t, gethLogs, 1) + + ethTransferLog := gethLogs[0] + require.Equal(t, gethParams.SystemAddress, ethTransferLog.Address) + require.Len(t, ethTransferLog.Topics, 3) + require.Equal(t, gethParams.EthTransferLogEvent, ethTransferLog.Topics[0]) + require.Equal(t, common.BytesToHash(coaAddress.Bytes()), ethTransferLog.Topics[1]) + require.Equal(t, common.BytesToHash(contractAddress.Bytes()), ethTransferLog.Topics[2]) + require.Equal(t, big.NewInt(1_230_000_000_000_000_000), new(big.Int).SetBytes(ethTransferLog.Data)) + }, + ) }) t.Run("test coa dryCall", func(t *testing.T) { @@ -2912,7 +3261,7 @@ func TestCadenceOwnedAccountFunctionalities(t *testing.T) { testContract.DeployedAt.ToCommon(), testContract.MakeCallData(t, "store", big.NewInt(num)), big.NewInt(0), - uint64(50_000), + uint64(125_000), big.NewInt(0), ) @@ -3060,7 +3409,7 @@ func TestCadenceOwnedAccountFunctionalities(t *testing.T) { testContract.DeployedAt.ToCommon(), testContract.MakeCallData(t, "store", big.NewInt(num)), big.NewInt(0), - uint64(50_000), + uint64(125_000), big.NewInt(0), ) @@ -3238,7 +3587,7 @@ func TestCadenceOwnedAccountFunctionalities(t *testing.T) { }) }) - t.Run("test coa deploy with bigger than max gas limit cap", func(t *testing.T) { + t.Run("test coa deploy with bigger than max gas limit cap under Amsterdam", func(t *testing.T) { RunWithNewEnvironment(t, chain, func( ctx fvm.Context, @@ -3291,16 +3640,12 @@ func TestCadenceOwnedAccountFunctionalities(t *testing.T) { res, err := impl.ResultSummaryFromEVMResultValue(output.Value) require.NoError(t, err) - require.Equal(t, types.StatusInvalid, res.Status) - require.Equal(t, types.ValidationErrCodeMisc, res.ErrorCode) - require.Equal( - t, - "transaction gas limit too high (cap: 16777216, tx: 16777226)", - res.ErrorMessage, - ) - require.Nil(t, res.DeployedContractAddress) + require.Equal(t, types.StatusSuccessful, res.Status) + require.Equal(t, types.ErrCodeNoError, res.ErrorCode) + require.Empty(t, res.ErrorMessage) + require.NotNil(t, res.DeployedContractAddress) // we strip away first few bytes because they contain deploy code - require.Empty(t, []byte(res.ReturnedData)) + require.Equal(t, testContract.ByteCode[17:], []byte(res.ReturnedData)) }) }) } @@ -3505,7 +3850,7 @@ func TestDryRun(t *testing.T) { testContract.DeployedAt.ToCommon(), testContract.MakeCallData(t, "store", big.NewInt(num)), big.NewInt(0), - uint64(50_000), + uint64(125_000), big.NewInt(0), ) @@ -3541,7 +3886,7 @@ func TestDryRun(t *testing.T) { 0, testContract.DeployedAt.ToCommon(), big.NewInt(0), - uint64(50_000), + uint64(125_000), big.NewInt(0), data, ) @@ -3634,7 +3979,7 @@ func TestDryRun(t *testing.T) { testContract.DeployedAt.ToCommon(), testContract.MakeCallData(t, "store", big.NewInt(num)), big.NewInt(0), - uint64(50_000), + uint64(125_000), big.NewInt(0), ) @@ -3962,7 +4307,7 @@ func TestDryRun(t *testing.T) { 0, testContract.DeployedAt.ToCommon(), big.NewInt(0), - uint64(50_000), + uint64(125_000), big.NewInt(0), testContract.MakeCallData(t, "store", big.NewInt(num)), ) @@ -3995,7 +4340,7 @@ func TestDryRun(t *testing.T) { require.NoError(t, err) require.NoError(t, output.Err) - assert.Equal(t, uint64(28), output.ComputationUsed) + assert.Equal(t, uint64(47), output.ComputationUsed) // Increase call count of EVM.dryRun to 15 iterations = cadence.NewUInt(15) @@ -4015,7 +4360,7 @@ func TestDryRun(t *testing.T) { require.NoError(t, err) require.NoError(t, output.Err) - assert.Equal(t, uint64(81), output.ComputationUsed) + assert.Equal(t, uint64(137), output.ComputationUsed) }, ) }) @@ -4041,7 +4386,7 @@ func TestDryRun(t *testing.T) { testAccount.Nonce(), testContract.DeployedAt.ToCommon(), big.NewInt(0), - uint64(50_000), + uint64(125_000), big.NewInt(0), data, ) @@ -4053,7 +4398,7 @@ func TestDryRun(t *testing.T) { testContract.DeployedAt.ToCommon(), data, big.NewInt(0), - uint64(50_000), + uint64(125_000), big.NewInt(0), ) @@ -4100,7 +4445,7 @@ func TestDryRun(t *testing.T) { _, output, err := vm.Run(ctx, tx, snapshot) require.NoError(t, err) require.NoError(t, output.Err) - assert.Equal(t, uint64(15), output.ComputationUsed) + assert.Equal(t, uint64(22), output.ComputationUsed) }, ) }) @@ -4177,7 +4522,7 @@ func TestDryCall(t *testing.T) { ) { data := testContract.MakeCallData(t, "store", big.NewInt(1337)) - limit := uint64(50_000) + limit := uint64(125_000) tx := gethTypes.NewTransaction( 0, testContract.DeployedAt.ToCommon(), @@ -4257,7 +4602,7 @@ func TestDryCall(t *testing.T) { testContract.DeployedAt.ToCommon(), testContract.MakeCallData(t, "store", big.NewInt(num)), big.NewInt(0), - uint64(50_000), + uint64(125_000), big.NewInt(0), ) @@ -4591,7 +4936,7 @@ func TestDryCall(t *testing.T) { 0, testContract.DeployedAt.ToCommon(), big.NewInt(0), - uint64(50_000), + uint64(125_000), big.NewInt(0), testContract.MakeCallData(t, "store", big.NewInt(num)), ) @@ -4623,7 +4968,7 @@ func TestDryCall(t *testing.T) { require.NoError(t, err) require.NoError(t, output.Err) - assert.Equal(t, uint64(36), output.ComputationUsed) + assert.Equal(t, uint64(54), output.ComputationUsed) // Increase call count of EVM.dryCall to 15 iterations = cadence.NewUInt(15) @@ -4645,7 +4990,7 @@ func TestDryCall(t *testing.T) { require.NoError(t, err) require.NoError(t, output.Err) - assert.Equal(t, uint64(105), output.ComputationUsed) + assert.Equal(t, uint64(160), output.ComputationUsed) }, ) }) @@ -4866,7 +5211,7 @@ func TestDryCallWithSigAndArgs(t *testing.T) { cadence.NewUInt256(1337), } - limit := uint64(50_000) + limit := uint64(125_000) result, _ := dryCallWithSigAndArgs( t, @@ -4958,7 +5303,7 @@ func TestDryCallWithSigAndArgs(t *testing.T) { testContract.DeployedAt.ToCommon(), testContract.MakeCallData(t, "store", big.NewInt(num)), big.NewInt(0), - uint64(50_000), + uint64(125_000), big.NewInt(0), ) @@ -5979,10 +6324,12 @@ func TestEVMFileSystemContract(t *testing.T) { ` import EVM from %s - transaction(tx: [UInt8], coinbaseBytes: [UInt8; 20]){ + transaction(tx: [UInt8], coinbaseBytes: [UInt8; 20]) { prepare(account: &Account) { let coinbase = EVM.EVMAddress(bytes: coinbaseBytes) let res = EVM.run(tx: tx, coinbase: coinbase) + assert(res.status == EVM.Status.successful, message: "\(res.errorMessage)") + assert(res.errorCode == 0, message: "unexpected error code: \(res.errorCode)") } } `, @@ -6012,7 +6359,7 @@ func TestEVMFileSystemContract(t *testing.T) { buffer.String(), ), big.NewInt(0), - uint64(2_132_171), + uint64(3_375_890), big.NewInt(1), ) @@ -6071,7 +6418,7 @@ func TestEVMFileSystemContract(t *testing.T) { feeTranferEventPayload := TxEventToPayload(t, feeTransferEvent, sc.EVMContract.Address) require.Equal(t, uint16(types.ErrCodeNoError), feeTranferEventPayload.ErrorCode) require.Equal(t, uint16(1), feeTranferEventPayload.Index) - require.Equal(t, uint64(21000), feeTranferEventPayload.GasConsumed) + require.Equal(t, uint64(204_600), feeTranferEventPayload.GasConsumed) // //// commit block blockEventPayload, _ := callEVMHeartBeat(t, @@ -6081,7 +6428,7 @@ func TestEVMFileSystemContract(t *testing.T) { ) // require.NotEmpty(t, blockEventPayload.Hash) - require.Equal(t, uint64(2_132_170), blockEventPayload.TotalGasUsed) + require.Equal(t, uint64(3_580_480), blockEventPayload.TotalGasUsed) txHashes := types.TransactionHashes{txEventPayload.Hash, feeTranferEventPayload.Hash} require.Equal(t, @@ -6892,6 +7239,225 @@ func TestEVMPauseFunctionality(t *testing.T) { ) } +func TestEthLogEmissionWithSelfDestruct(t *testing.T) { + t.Parallel() + + chain := flow.Emulator.Chain() + + t.Run("test SelfDestruct with self as beneficiary emits EthBurnLog", func(t *testing.T) { + t.Parallel() + + RunContractWithNewEnvironment( + t, + chain, + GetFactoryTestContract(t), + func( + ctx fvm.Context, + vm fvm.VM, + snapshot snapshot.SnapshotTree, + testContract *TestContract, + testAccount *EOATestAccount, + ) { + sc := systemcontracts.SystemContractsForChain(chain.ChainID()) + code := fmt.Appendf(nil, + ` + import EVM from %s + + transaction(tx: [UInt8], coinbaseBytes: [UInt8; 20]){ + prepare(account: &Account) { + let coinbase = EVM.EVMAddress(bytes: coinbaseBytes) + let res = EVM.run(tx: tx, coinbase: coinbase) + + assert(res.status == EVM.Status.successful, message: "unexpected status") + assert(res.errorCode == 0, message: "unexpected error code") + assert(res.deployedContract == nil, message: "unexpected deployed contract") + } + } + `, + sc.EVMContract.Address.HexWithPrefix(), + ) + + coinbaseAddr := types.Address{1, 2, 3} + coinbaseBalance := getEVMAccountBalance(t, ctx, vm, snapshot, coinbaseAddr) + require.Zero(t, types.BalanceToBigInt(coinbaseBalance).Uint64()) + + salt := [32]byte{1} + storedValue := big.NewInt(100) + amount := big.NewInt(1_000_000) + innerTxBytes := testAccount.PrepareSignAndEncodeTx(t, + testContract.DeployedAt.ToCommon(), + testContract.MakeCallData(t, "depositDeployAndDestroyWithBurn", salt, amount, storedValue), + big.NewInt(0), + uint64(1_500_000), + big.NewInt(1), + ) + + innerTx := cadence.NewArray( + unittest.BytesToCdcUInt8(innerTxBytes), + ).WithType(stdlib.EVMTransactionBytesCadenceType) + + coinbase := cadence.NewArray( + unittest.BytesToCdcUInt8(coinbaseAddr.Bytes()), + ).WithType(stdlib.EVMAddressBytesCadenceType) + + txBody, err := flow.NewTransactionBodyBuilder(). + SetScript(code). + SetPayer(sc.FlowServiceAccount.Address). + AddAuthorizer(sc.FlowServiceAccount.Address). + AddArgument(json.MustEncode(innerTx)). + AddArgument(json.MustEncode(coinbase)). + Build() + require.NoError(t, err) + + tx := fvm.Transaction(txBody, 0) + state, output, err := vm.Run(ctx, tx, snapshot) + require.NoError(t, err) + require.NoError(t, output.Err) + require.NotEmpty(t, state.WriteSet) + + // assert event fields are correct + require.Len(t, output.Events, 2) + txEvent := output.Events[0] + txEventPayload := TxEventToPayload(t, txEvent, sc.EVMContract.Address) + require.NoError(t, err) + require.Equal(t, uint16(types.ErrCodeNoError), txEventPayload.ErrorCode) + require.Equal(t, uint16(0), txEventPayload.Index) + require.Equal(t, uint64(1_268_668), txEventPayload.GasConsumed) + require.Greater(t, len(txEventPayload.Logs), 0) + + gethLogs := []*gethTypes.Log{} + err = rlp.Decode(bytes.NewReader(txEventPayload.Logs), &gethLogs) + require.NoError(t, err) + require.Len(t, gethLogs, 2) + + ethTransferLog := gethLogs[0] + selfDestructContract := ethTransferLog.Topics[2] + require.Equal(t, gethParams.SystemAddress, ethTransferLog.Address) + require.Len(t, ethTransferLog.Topics, 3) + require.Equal(t, gethParams.EthTransferLogEvent, ethTransferLog.Topics[0]) + require.Equal(t, common.BytesToHash(testContract.DeployedAt.Bytes()), ethTransferLog.Topics[1]) + require.Equal(t, amount, new(big.Int).SetBytes(ethTransferLog.Data)) + + ethBurnLog := gethLogs[1] + // Since the beneficiary is the contract being self-destructed, + // its ETH balance is burned + require.Equal(t, gethParams.SystemAddress, ethBurnLog.Address) + require.Len(t, ethBurnLog.Topics, 2) + require.Equal(t, gethParams.EthBurnLogEvent, ethBurnLog.Topics[0]) + require.Equal(t, amount, new(big.Int).SetBytes(ethBurnLog.Data)) + require.Equal(t, selfDestructContract, ethBurnLog.Topics[1]) + }, + ) + }) + + t.Run("test SelfDestruct with non-self as beneficiary does not emit EthBurnLog", func(t *testing.T) { + t.Parallel() + + RunContractWithNewEnvironment( + t, + chain, + GetFactoryTestContract(t), + func( + ctx fvm.Context, + vm fvm.VM, + snapshot snapshot.SnapshotTree, + testContract *TestContract, + testAccount *EOATestAccount, + ) { + sc := systemcontracts.SystemContractsForChain(chain.ChainID()) + code := fmt.Appendf(nil, + ` + import EVM from %s + + transaction(tx: [UInt8], coinbaseBytes: [UInt8; 20]){ + prepare(account: &Account) { + let coinbase = EVM.EVMAddress(bytes: coinbaseBytes) + let res = EVM.run(tx: tx, coinbase: coinbase) + + assert(res.status == EVM.Status.successful, message: "unexpected status") + assert(res.errorCode == 0, message: "unexpected error code") + assert(res.deployedContract == nil, message: "unexpected deployed contract") + } + } + `, + sc.EVMContract.Address.HexWithPrefix(), + ) + + coinbaseAddr := types.Address{1, 2, 3} + coinbaseBalance := getEVMAccountBalance(t, ctx, vm, snapshot, coinbaseAddr) + require.Zero(t, types.BalanceToBigInt(coinbaseBalance).Uint64()) + + salt := [32]byte{1} + storedValue := big.NewInt(100) + amount := big.NewInt(1_000_000) + innerTxBytes := testAccount.PrepareSignAndEncodeTx(t, + testContract.DeployedAt.ToCommon(), + testContract.MakeCallData(t, "depositDeployAndDestroy", salt, amount, storedValue), + big.NewInt(0), + uint64(1_500_000), + big.NewInt(1), + ) + + innerTx := cadence.NewArray( + unittest.BytesToCdcUInt8(innerTxBytes), + ).WithType(stdlib.EVMTransactionBytesCadenceType) + + coinbase := cadence.NewArray( + unittest.BytesToCdcUInt8(coinbaseAddr.Bytes()), + ).WithType(stdlib.EVMAddressBytesCadenceType) + + txBody, err := flow.NewTransactionBodyBuilder(). + SetScript(code). + SetPayer(sc.FlowServiceAccount.Address). + AddAuthorizer(sc.FlowServiceAccount.Address). + AddArgument(json.MustEncode(innerTx)). + AddArgument(json.MustEncode(coinbase)). + Build() + require.NoError(t, err) + + tx := fvm.Transaction(txBody, 0) + state, output, err := vm.Run(ctx, tx, snapshot) + require.NoError(t, err) + require.NoError(t, output.Err) + require.NotEmpty(t, state.WriteSet) + + // assert event fields are correct + require.Len(t, output.Events, 2) + txEvent := output.Events[0] + txEventPayload := TxEventToPayload(t, txEvent, sc.EVMContract.Address) + require.NoError(t, err) + require.Equal(t, uint16(types.ErrCodeNoError), txEventPayload.ErrorCode) + require.Equal(t, uint16(0), txEventPayload.Index) + require.Equal(t, uint64(1_268_689), txEventPayload.GasConsumed) + require.Greater(t, len(txEventPayload.Logs), 0) + + gethLogs := []*gethTypes.Log{} + err = rlp.Decode(bytes.NewReader(txEventPayload.Logs), &gethLogs) + require.NoError(t, err) + require.Len(t, gethLogs, 2) + + ethTransferLog := gethLogs[0] + selfDestructContract := ethTransferLog.Topics[2] + require.Equal(t, gethParams.SystemAddress, ethTransferLog.Address) + require.Len(t, ethTransferLog.Topics, 3) + require.Equal(t, gethParams.EthTransferLogEvent, ethTransferLog.Topics[0]) + require.Equal(t, common.BytesToHash(testContract.DeployedAt.Bytes()), ethTransferLog.Topics[1]) + require.Equal(t, amount, new(big.Int).SetBytes(ethTransferLog.Data)) + + ethTransferLog = gethLogs[1] + // Since the beneficiary is NOT the contract being self-destructed, + // its ETH balance is simply transferred, not burned + require.Equal(t, gethParams.SystemAddress, ethTransferLog.Address) + require.Len(t, ethTransferLog.Topics, 3) + require.Equal(t, gethParams.EthTransferLogEvent, ethTransferLog.Topics[0]) + require.Equal(t, selfDestructContract, ethTransferLog.Topics[1]) + require.Equal(t, common.BytesToHash(testContract.DeployedAt.Bytes()), ethTransferLog.Topics[2]) + require.Equal(t, amount, new(big.Int).SetBytes(ethTransferLog.Data)) + }, + ) + }) +} + func createAndFundFlowAccount( t *testing.T, ctx fvm.Context, diff --git a/fvm/evm/handler/coa/coa.go b/fvm/evm/handler/coa/coa.go index 8be5394cff5..29022119629 100644 --- a/fvm/evm/handler/coa/coa.go +++ b/fvm/evm/handler/coa/coa.go @@ -5,7 +5,7 @@ import ( "encoding/hex" ) -var ContractDeploymentRequiredGas = uint64(723_000) +const ContractDeploymentRequiredGas = uint64(5_385_000) //go:embed coa_bytes.hex var contractBytesInHex string diff --git a/fvm/evm/handler/handler.go b/fvm/evm/handler/handler.go index 3f935bc87a1..a1cb322597b 100644 --- a/fvm/evm/handler/handler.go +++ b/fvm/evm/handler/handler.go @@ -743,6 +743,7 @@ func (h *ContractHandler) getBlockContext(bp *types.BlockProposal) ( }, ExtraPrecompiledContracts: h.precompiledContracts, Random: bp.PrevRandao, + SlotNum: bp.SlotNumber(h.flowChainID), TxCountSoFar: uint(len(bp.TxHashes)), TotalGasUsedSoFar: bp.TotalGasUsed, GasFeeCollector: types.CoinbaseAddress, diff --git a/fvm/evm/handler/handler_test.go b/fvm/evm/handler/handler_test.go index 49435a2d9f7..833db988de5 100644 --- a/fvm/evm/handler/handler_test.go +++ b/fvm/evm/handler/handler_test.go @@ -396,7 +396,7 @@ func TestHandler_COA(t *testing.T) { // check gas usage computationUsed, err := backend.ComputationUsed() require.NoError(t, err) - require.Greater(t, computationUsed, types.DefaultDirectCallBaseGasUsage*3) + require.Equal(t, uint64(5_417_605), computationUsed) // Withdraw with invalid balance assertPanic(t, types.IsAWithdrawBalanceRoundingError, func() { diff --git a/fvm/evm/offchain/sync/replayer_test.go b/fvm/evm/offchain/sync/replayer_test.go index d92a12bb644..92e0bc08817 100644 --- a/fvm/evm/offchain/sync/replayer_test.go +++ b/fvm/evm/offchain/sync/replayer_test.go @@ -42,7 +42,7 @@ func TestChainReplay(t *testing.T) { testContract.DeployedAt.ToCommon(), testContract.MakeCallData(t, "checkThenStore", big.NewInt(int64(i)), big.NewInt(int64(i+1))), big.NewInt(0), - uint64(100_000), + uint64(125_000), big.NewInt(1), ) rs := handler.Run(tx, gasFeeCollector) @@ -58,7 +58,7 @@ func TestChainReplay(t *testing.T) { testContract.DeployedAt.ToCommon(), testContract.MakeCallData(t, "store", big.NewInt(int64(i))), big.NewInt(0), - uint64(100_000), + uint64(125_000), big.NewInt(1), ) } diff --git a/fvm/evm/testutils/contract.go b/fvm/evm/testutils/contract.go index b73e5463417..9ca2fab3a0a 100644 --- a/fvm/evm/testutils/contract.go +++ b/fvm/evm/testutils/contract.go @@ -93,29 +93,31 @@ func DeployContract(t testing.TB, caller types.Address, tc *TestContract, led at blk, err := e.NewBlockView(ctx) require.NoError(t, err) - _, err = blk.DirectCall( + res, err := blk.DirectCall( types.NewDepositCall( RandomAddress(t), // any random non-empty address works here caller, - new(big.Int).Mul(big.NewInt(1e18), big.NewInt(1000)), + new(big.Int).Mul(big.NewInt(5e18), big.NewInt(1000)), nonce, ), ) require.NoError(t, err) + require.True(t, res.Successful()) blk2, err := e.NewBlockView(types.NewDefaultBlockContext(3)) require.NoError(t, err) - res, err := blk2.DirectCall( + res, err = blk2.DirectCall( types.NewDeployCall( caller, tc.ByteCode, gethParams.MaxTxGas, - big.NewInt(0), + big.NewInt(1_000_000_000_000_000_000), // fund the newly-deployed contract nonce+1, ), ) require.NoError(t, err) + require.True(t, res.Successful()) require.NotNil(t, res.DeployedContractAddress) tc.SetDeployedAt(*res.DeployedContractAddress) } diff --git a/fvm/evm/testutils/contracts/factory.sol b/fvm/evm/testutils/contracts/factory.sol index 39ffea4e7be..c1f011d1761 100644 --- a/fvm/evm/testutils/contracts/factory.sol +++ b/fvm/evm/testutils/contracts/factory.sol @@ -40,6 +40,18 @@ contract Factory { dep.destroy(address(this)); } + function depositDeployAndDestroyWithBurn(bytes32 salt, uint256 amount, uint256 stored) public { + address addr = _getCreate2Address(salt, keccak256(abi.encodePacked(type(Deployable).creationCode))); + bool success; + assembly { + success := call(gas(), addr, amount, 0, 0, 0, 0) + } + require(success); + Deployable dep = new Deployable{salt: salt}(); + dep.set(stored); + dep.destroy(addr); + } + function _getCreate2Address(bytes32 salt, bytes32 codeHash) internal view returns (address) { return address(uint160(uint256(keccak256(abi.encodePacked(bytes1(0xff), address(this), salt, codeHash))))); } diff --git a/fvm/evm/testutils/contracts/factory_abi.json b/fvm/evm/testutils/contracts/factory_abi.json index 924407ab38a..4b86dcc1140 100644 --- a/fvm/evm/testutils/contracts/factory_abi.json +++ b/fvm/evm/testutils/contracts/factory_abi.json @@ -92,5 +92,28 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stored", + "type": "uint256" + } + ], + "name": "depositDeployAndDestroyWithBurn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" } ] \ No newline at end of file diff --git a/fvm/evm/testutils/contracts/factory_bytes.hex b/fvm/evm/testutils/contracts/factory_bytes.hex index ebe208d2232..bd9133ca5d7 100644 --- a/fvm/evm/testutils/contracts/factory_bytes.hex +++ b/fvm/evm/testutils/contracts/factory_bytes.hex @@ -1 +1 @@ -6080604052610af6806100115f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80632b85ba381461004e578063624ff5c41461007e5780639e3bb99e1461009a578063cf4fe092146100b6575b5f80fd5b610068600480360381019061006391906105b4565b6100e6565b604051610075919061061e565b60405180910390f35b6100986004803603810190610093919061066a565b61016d565b005b6100b460048036038101906100af91906106ba565b6102d8565b005b6100d060048036038101906100cb919061066a565b6103d6565b6040516100dd919061061e565b60405180910390f35b5f816040516100f490610570565b8190604051809103905ff5905080158015610111573d5f803e3d5ffd5b5050610166826040518060200161012790610570565b6020820181038252601f19601f8201166040525060405160200161014b919061074a565b60405160208183030381529060405280519060200120610534565b9050919050565b5f6101c1846040518060200161018290610570565b6020820181038252601f19601f820116604052506040516020016101a6919061074a565b60405160208183030381529060405280519060200120610534565b90505f805f805f87865af19050806101d7575f80fd5b5f856040516101e590610570565b8190604051809103905ff5905080158015610202573d5f803e3d5ffd5b5090508073ffffffffffffffffffffffffffffffffffffffff166360fe47b1856040518263ffffffff1660e01b815260040161023e919061076f565b5f604051808303815f87803b158015610255575f80fd5b505af1158015610267573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff1662f55d9d306040518263ffffffff1660e01b81526004016102a3919061061e565b5f604051808303815f87803b1580156102ba575f80fd5b505af11580156102cc573d5f803e3d5ffd5b50505050505050505050565b5f826040516102e690610570565b8190604051809103905ff5905080158015610303573d5f803e3d5ffd5b5090508073ffffffffffffffffffffffffffffffffffffffff166360fe47b1836040518263ffffffff1660e01b815260040161033f919061076f565b5f604051808303815f87803b158015610356575f80fd5b505af1158015610368573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff1662f55d9d306040518263ffffffff1660e01b81526004016103a4919061061e565b5f604051808303815f87803b1580156103bb575f80fd5b505af11580156103cd573d5f803e3d5ffd5b50505050505050565b5f8061042b85604051806020016103ec90610570565b6020820181038252601f19601f82011660405250604051602001610410919061074a565b60405160208183030381529060405280519060200120610534565b90505f805f805f88865af1905080610441575f80fd5b5f8660405161044f90610570565b8190604051809103905ff590508015801561046c573d5f803e3d5ffd5b5090508073ffffffffffffffffffffffffffffffffffffffff166360fe47b1866040518263ffffffff1660e01b81526004016104a8919061076f565b5f604051808303815f87803b1580156104bf575f80fd5b505af11580156104d1573d5f803e3d5ffd5b5050505061052887604051806020016104e990610570565b6020820181038252601f19601f8201166040525060405160200161050d919061074a565b60405160208183030381529060405280519060200120610534565b93505050509392505050565b5f60ff60f81b3084846040516020016105509493929190610838565b604051602081830303815290604052805190602001205f1c905092915050565b61023b8061088683390190565b5f80fd5b5f819050919050565b61059381610581565b811461059d575f80fd5b50565b5f813590506105ae8161058a565b92915050565b5f602082840312156105c9576105c861057d565b5b5f6105d6848285016105a0565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610608826105df565b9050919050565b610618816105fe565b82525050565b5f6020820190506106315f83018461060f565b92915050565b5f819050919050565b61064981610637565b8114610653575f80fd5b50565b5f8135905061066481610640565b92915050565b5f805f606084860312156106815761068061057d565b5b5f61068e868287016105a0565b935050602061069f86828701610656565b92505060406106b086828701610656565b9150509250925092565b5f80604083850312156106d0576106cf61057d565b5b5f6106dd858286016105a0565b92505060206106ee85828601610656565b9150509250929050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f610724826106f8565b61072e8185610702565b935061073e81856020860161070c565b80840191505092915050565b5f610755828461071a565b915081905092915050565b61076981610637565b82525050565b5f6020820190506107825f830184610760565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b5f819050919050565b6107cd6107c882610788565b6107b3565b82525050565b5f8160601b9050919050565b5f6107e9826107d3565b9050919050565b5f6107fa826107df565b9050919050565b61081261080d826105fe565b6107f0565b82525050565b5f819050919050565b61083261082d82610581565b610818565b82525050565b5f61084382876107bc565b6001820191506108538286610801565b6014820191506108638285610821565b6020820191506108738284610821565b6020820191508190509594505050505056fe608060405261022a806100115f395ff3fe608060405260043610610036575f3560e01c8062f55d9d1461004157806360fe47b1146100695780636d4ce63c146100915761003d565b3661003d57005b5f80fd5b34801561004c575f80fd5b5061006760048036038101906100629190610143565b6100bb565b005b348015610074575f80fd5b5061008f600480360381019061008a91906101a1565b6100d4565b005b34801561009c575f80fd5b506100a56100dd565b6040516100b291906101db565b60405180910390f35b8073ffffffffffffffffffffffffffffffffffffffff16ff5b805f8190555050565b5f8054905090565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610112826100e9565b9050919050565b61012281610108565b811461012c575f80fd5b50565b5f8135905061013d81610119565b92915050565b5f60208284031215610158576101576100e5565b5b5f6101658482850161012f565b91505092915050565b5f819050919050565b6101808161016e565b811461018a575f80fd5b50565b5f8135905061019b81610177565b92915050565b5f602082840312156101b6576101b56100e5565b5b5f6101c38482850161018d565b91505092915050565b6101d58161016e565b82525050565b5f6020820190506101ee5f8301846101cc565b9291505056fea2646970667358221220cbb07f58eed2fb91caf5b496fe4f528d45cf25085898c4f2735c5dcf5bd2fc9f64736f6c634300081a0033a2646970667358221220d1e0a588152bd25c8a5276df79dde8e504c854e590f1dbb00ec9808aee242b4164736f6c634300081a0033 \ No newline at end of file +6080604052610cee806100115f395ff3fe608060405234801561000f575f80fd5b5060043610610055575f3560e01c80632b85ba381461005957806336b6aef414610089578063624ff5c4146100a55780639e3bb99e146100c1578063cf4fe092146100dd575b5f80fd5b610073600480360381019061006e9190610746565b61010d565b60405161008091906107b0565b60405180910390f35b6100a3600480360381019061009e91906107fc565b610194565b005b6100bf60048036038101906100ba91906107fc565b6102ff565b005b6100db60048036038101906100d6919061084c565b61046a565b005b6100f760048036038101906100f291906107fc565b610568565b60405161010491906107b0565b60405180910390f35b5f8160405161011b90610702565b8190604051809103905ff5905080158015610138573d5f803e3d5ffd5b505061018d826040518060200161014e90610702565b6020820181038252601f19601f8201166040525060405160200161017291906108f6565b604051602081830303815290604052805190602001206106c6565b9050919050565b5f6101e884604051806020016101a990610702565b6020820181038252601f19601f820116604052506040516020016101cd91906108f6565b604051602081830303815290604052805190602001206106c6565b90505f805f805f87865af19050806101fe575f80fd5b5f8560405161020c90610702565b8190604051809103905ff5905080158015610229573d5f803e3d5ffd5b5090508073ffffffffffffffffffffffffffffffffffffffff166360fe47b1856040518263ffffffff1660e01b8152600401610265919061091b565b5f604051808303815f87803b15801561027c575f80fd5b505af115801561028e573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff1662f55d9d846040518263ffffffff1660e01b81526004016102ca91906107b0565b5f604051808303815f87803b1580156102e1575f80fd5b505af11580156102f3573d5f803e3d5ffd5b50505050505050505050565b5f610353846040518060200161031490610702565b6020820181038252601f19601f8201166040525060405160200161033891906108f6565b604051602081830303815290604052805190602001206106c6565b90505f805f805f87865af1905080610369575f80fd5b5f8560405161037790610702565b8190604051809103905ff5905080158015610394573d5f803e3d5ffd5b5090508073ffffffffffffffffffffffffffffffffffffffff166360fe47b1856040518263ffffffff1660e01b81526004016103d0919061091b565b5f604051808303815f87803b1580156103e7575f80fd5b505af11580156103f9573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff1662f55d9d306040518263ffffffff1660e01b815260040161043591906107b0565b5f604051808303815f87803b15801561044c575f80fd5b505af115801561045e573d5f803e3d5ffd5b50505050505050505050565b5f8260405161047890610702565b8190604051809103905ff5905080158015610495573d5f803e3d5ffd5b5090508073ffffffffffffffffffffffffffffffffffffffff166360fe47b1836040518263ffffffff1660e01b81526004016104d1919061091b565b5f604051808303815f87803b1580156104e8575f80fd5b505af11580156104fa573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff1662f55d9d306040518263ffffffff1660e01b815260040161053691906107b0565b5f604051808303815f87803b15801561054d575f80fd5b505af115801561055f573d5f803e3d5ffd5b50505050505050565b5f806105bd856040518060200161057e90610702565b6020820181038252601f19601f820116604052506040516020016105a291906108f6565b604051602081830303815290604052805190602001206106c6565b90505f805f805f88865af19050806105d3575f80fd5b5f866040516105e190610702565b8190604051809103905ff59050801580156105fe573d5f803e3d5ffd5b5090508073ffffffffffffffffffffffffffffffffffffffff166360fe47b1866040518263ffffffff1660e01b815260040161063a919061091b565b5f604051808303815f87803b158015610651575f80fd5b505af1158015610663573d5f803e3d5ffd5b505050506106ba876040518060200161067b90610702565b6020820181038252601f19601f8201166040525060405160200161069f91906108f6565b604051602081830303815290604052805190602001206106c6565b93505050509392505050565b5f60ff60f81b3084846040516020016106e294939291906109e4565b604051602081830303815290604052805190602001205f1c905092915050565b61026180610a3283390190565b5f80fd5b5f819050919050565b61072581610713565b811461072f575f80fd5b50565b5f813590506107408161071c565b92915050565b5f6020828403121561075b5761075a61070f565b5b5f61076884828501610732565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61079a82610771565b9050919050565b6107aa81610790565b82525050565b5f6020820190506107c35f8301846107a1565b92915050565b5f819050919050565b6107db816107c9565b81146107e5575f80fd5b50565b5f813590506107f6816107d2565b92915050565b5f805f606084860312156108135761081261070f565b5b5f61082086828701610732565b9350506020610831868287016107e8565b9250506040610842868287016107e8565b9150509250925092565b5f80604083850312156108625761086161070f565b5b5f61086f85828601610732565b9250506020610880858286016107e8565b9150509250929050565b5f81519050919050565b5f81905092915050565b5f5b838110156108bb5780820151818401526020810190506108a0565b5f8484015250505050565b5f6108d08261088a565b6108da8185610894565b93506108ea81856020860161089e565b80840191505092915050565b5f61090182846108c6565b915081905092915050565b610915816107c9565b82525050565b5f60208201905061092e5f83018461090c565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b5f819050919050565b61097961097482610934565b61095f565b82525050565b5f8160601b9050919050565b5f6109958261097f565b9050919050565b5f6109a68261098b565b9050919050565b6109be6109b982610790565b61099c565b82525050565b5f819050919050565b6109de6109d982610713565b6109c4565b82525050565b5f6109ef8287610968565b6001820191506109ff82866109ad565b601482019150610a0f82856109cd565b602082019150610a1f82846109cd565b6020820191508190509594505050505056fe6080604052610250806100115f395ff3fe608060405260043610610036575f3560e01c8062f55d9d1461004157806360fe47b1146100695780636d4ce63c146100915761003d565b3661003d57005b5f80fd5b34801561004c575f80fd5b5061006760048036038101906100629190610143565b6100bb565b005b348015610074575f80fd5b5061008f600480360381019061008a91906101a1565b6100d4565b005b34801561009c575f80fd5b506100a56100dd565b6040516100b291906101db565b60405180910390f35b8073ffffffffffffffffffffffffffffffffffffffff16ff5b805f8190555050565b5f8054905090565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610112826100e9565b9050919050565b61012281610108565b811461012c575f80fd5b50565b5f8135905061013d81610119565b92915050565b5f60208284031215610158576101576100e5565b5b5f6101658482850161012f565b91505092915050565b5f819050919050565b6101808161016e565b811461018a575f80fd5b50565b5f8135905061019b81610177565b92915050565b5f602082840312156101b6576101b56100e5565b5b5f6101c38482850161018d565b91505092915050565b6101d58161016e565b82525050565b5f6020820190506101ee5f8301846101cc565b9291505056fea2646970667358221220276125ddd5ed72c9b59ad463a191db4b1a9c223045384c9464219b8928073f5c64736f6c637828302e382e32352d646576656c6f702e323032342e322e32342b636f6d6d69742e64626137353465630059a2646970667358221220c97763d4984d0d585e7a99df547fdfe0bdc0ee10710a8814e75e709ea8e604a564736f6c637828302e382e32352d646576656c6f702e323032342e322e32342b636f6d6d69742e64626137353465630059 \ No newline at end of file diff --git a/fvm/evm/types/block.go b/fvm/evm/types/block.go index a9f48f581c9..2e7f0f1e153 100644 --- a/fvm/evm/types/block.go +++ b/fvm/evm/types/block.go @@ -62,6 +62,37 @@ func (b *Block) Hash() (gethCommon.Hash, error) { return gethCrypto.Keccak256Hash(data), err } +// SlotNumber returns the corresponding slot number for the current block. +// In Ethereum, a slot is a 12-second time period where a validator is assigned +// to propose a new block, functioning as the network's "heartbeat" in PoS. +// Slots occur automatically every 12 seconds, and 32 slots are grouped together +// into a 6.4-minute period known as an epoch. +func (b *Block) SlotNumber(chainID flow.ChainID) uint64 { + // To calculate the Ethereum slot number from a block timestamp, + // subtract the Genesis timestamp from the block timestamp and + // divide by the slot duration (12 seconds on Ethereum). + // The formula is: slot = (block timestamp - genesis timestamp) / slot duration + // as slot duration we can use the block production rate, on each network. + // testnet is running at 2 block / sec. + // mainnet is running at 1.25 block / sec. + genesisTimestamp := GenesisTimestamp(chainID) + // prevent uint64 underflow + if b.Timestamp <= genesisTimestamp { + return 0 + } + + switch chainID { + case flow.Mainnet: + return ((b.Timestamp - genesisTimestamp) * 5) / 4 + case flow.Testnet: + return ((b.Timestamp - genesisTimestamp) * 2) + default: + // for all other networks (emulator/previewnet etc), + // default to a slot duration of 1 second + return b.Timestamp - genesisTimestamp + } +} + // NewBlock constructs a new block func NewBlock( parentBlockHash gethCommon.Hash, @@ -97,6 +128,8 @@ func NewBlockFromBytes(encoded []byte) (*Block, error) { // GenesisTimestamp returns the block time stamp for EVM genesis block func GenesisTimestamp(flowChainID flow.ChainID) uint64 { switch flowChainID { + case flow.Emulator, flow.Previewnet: + return uint64(time.Date(2024, time.January, 1, 0, 0, 0, 0, time.UTC).Unix()) case flow.Testnet: return uint64(time.Date(2024, time.August, 1, 0, 0, 0, 0, time.UTC).Unix()) case flow.Mainnet: diff --git a/fvm/evm/types/block_test.go b/fvm/evm/types/block_test.go index 03e6ca530f7..126677e3a36 100644 --- a/fvm/evm/types/block_test.go +++ b/fvm/evm/types/block_test.go @@ -3,6 +3,7 @@ package types import ( "math/big" "testing" + "time" gethCommon "github.com/ethereum/go-ethereum/common" gethTypes "github.com/ethereum/go-ethereum/core/types" @@ -51,6 +52,24 @@ func Test_BlockHash(t *testing.T) { assert.NotEqual(t, h1, h2) } +func Test_SlotNumber(t *testing.T) { + timestamp := uint64(time.Date(2026, time.January, 1, 0, 0, 0, 0, time.UTC).Unix()) + b := Block{ + ParentBlockHash: gethCommon.HexToHash("0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), + Height: 1, + TotalSupply: big.NewInt(1000), + ReceiptRoot: gethCommon.Hash{0x2, 0x3, 0x4}, + TotalGasUsed: 135, + TransactionHashRoot: gethCommon.Hash{0x5, 0x6, 0x7}, + Timestamp: timestamp, + } + + require.Equal(t, uint64(63_158_400), b.SlotNumber(flow.Emulator)) + require.Equal(t, uint64(63_158_400), b.SlotNumber(flow.Previewnet)) + require.Equal(t, uint64(89_510_400), b.SlotNumber(flow.Testnet)) + require.Equal(t, uint64(52_596_000), b.SlotNumber(flow.Mainnet)) +} + func Test_BlockProposal(t *testing.T) { bp := NewBlockProposal(gethCommon.Hash{1}, 1, 0, nil, gethCommon.Hash{1, 2, 3}) diff --git a/fvm/evm/types/call.go b/fvm/evm/types/call.go index 3df8f136e0d..026dec3e43b 100644 --- a/fvm/evm/types/call.go +++ b/fvm/evm/types/call.go @@ -9,6 +9,7 @@ import ( gethTypes "github.com/ethereum/go-ethereum/core/types" gethParams "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" + "github.com/holiman/uint256" ) const ( @@ -35,6 +36,10 @@ const ( // to smart contract addresses. DepositCallGasLimit = DefaultGasLimitForTokenTransfer WithdrawCallGasLimit = DefaultGasLimitForTokenTransfer + + // With EIP-8037, each state-creation transaction (such as funding a fresh EOA), + // needs an extra gas limit, as calculated below. + StateCreationGasLimit = gethParams.AccountCreationSize * gethParams.CostPerStateByte ) // DirectCall captures all the data related to a direct call to evm @@ -94,13 +99,13 @@ func (dc *DirectCall) Message() *gethCore.Message { return &gethCore.Message{ From: dc.From.ToCommon(), To: dc.to(), - Value: dc.Value, + Value: uint256.MustFromBig(dc.Value), Data: dc.Data, Nonce: dc.Nonce, GasLimit: dc.GasLimit, - GasPrice: big.NewInt(0), // price is set to zero fo direct calls - GasTipCap: big.NewInt(0), // also known as maxPriorityFeePerGas (in GWei) - GasFeeCap: big.NewInt(0), // also known as maxFeePerGas (in GWei) + GasPrice: uint256.NewInt(0), // price is set to zero fo direct calls + GasTipCap: uint256.NewInt(0), // also known as maxPriorityFeePerGas (in GWei) + GasFeeCap: uint256.NewInt(0), // also known as maxFeePerGas (in GWei) SetCodeAuthorizations: dc.setCodeAuthorizations, // introduced in EIP-7702 tx type // TODO: maybe revisit setting the access list // AccessList: tx.AccessList(), @@ -167,15 +172,11 @@ func (dc *DirectCall) ValidEIP7825GasLimit(rules gethParams.Rules) bool { return true } - // If the `Osaka` hard-fork is not activated, then there's no need to - // check for EIP-7825 gas limit validity. - if !rules.IsOsaka { - return true - } - - // After the `Osaka` hard-fork, direct calls have the same gas limit + // Under the `Osaka` hard-fork, direct calls have the same gas limit // cap as native EVM transactions. - if dc.GasLimit > gethParams.MaxTxGas { + // Under the `Amsterdam`` hard-fork, the gas limit cap was removed + // in favor of EIP-8037. + if dc.GasLimit > gethParams.MaxTxGas && rules.IsOsaka && !rules.IsAmsterdam { return false } @@ -204,7 +205,7 @@ func NewDepositCall( To: address, Data: nil, Value: amount, - GasLimit: DepositCallGasLimit, + GasLimit: DepositCallGasLimit + StateCreationGasLimit, Nonce: nonce, } } @@ -241,7 +242,7 @@ func NewTransferCall( To: to, Data: nil, Value: amount, - GasLimit: DefaultGasLimitForTokenTransfer, + GasLimit: DefaultGasLimitForTokenTransfer + StateCreationGasLimit, Nonce: nonce, } } diff --git a/fvm/evm/types/codeFinder.go b/fvm/evm/types/codeFinder.go index 8f987f3ecb3..cc44e7100df 100644 --- a/fvm/evm/types/codeFinder.go +++ b/fvm/evm/types/codeFinder.go @@ -28,7 +28,7 @@ func ValidationErrorCode(err error) ErrorCode { return ValidationErrCodeGasLimitReached case gethCore.ErrInsufficientFundsForTransfer: return ValidationErrCodeInsufficientFundsForTransfer - case gethCore.ErrMaxInitCodeSizeExceeded: + case gethVM.ErrMaxInitCodeSizeExceeded: return ValidationErrCodeMaxInitCodeSizeExceeded case gethCore.ErrInsufficientFunds: return ValidationErrCodeInsufficientFunds @@ -104,7 +104,7 @@ func ErrorFromCode(errorCode ErrorCode) error { case ValidationErrCodeInsufficientFundsForTransfer: return gethCore.ErrInsufficientFundsForTransfer case ValidationErrCodeMaxInitCodeSizeExceeded: - return gethCore.ErrMaxInitCodeSizeExceeded + return gethVM.ErrMaxInitCodeSizeExceeded case ValidationErrCodeInsufficientFunds: return gethCore.ErrInsufficientFunds case ValidationErrCodeIntrinsicGas: diff --git a/fvm/evm/types/emulator.go b/fvm/evm/types/emulator.go index 5d6b32f3a68..2461dc675cf 100644 --- a/fvm/evm/types/emulator.go +++ b/fvm/evm/types/emulator.go @@ -46,6 +46,7 @@ type BlockContext struct { GasFeeCollector Address GetHashFunc func(n uint64) gethCommon.Hash Random gethCommon.Hash + SlotNum uint64 Tracer *tracers.Tracer // a set of extra precompiled contracts to be injected diff --git a/fvm/evm/types/result.go b/fvm/evm/types/result.go index a585eb11655..6c9e045c46b 100644 --- a/fvm/evm/types/result.go +++ b/fvm/evm/types/result.go @@ -6,6 +6,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" gethCommon "github.com/ethereum/go-ethereum/common" gethTypes "github.com/ethereum/go-ethereum/core/types" + gethBAL "github.com/ethereum/go-ethereum/core/types/bal" gethVM "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/rlp" ) @@ -99,6 +100,8 @@ type Result struct { PrecompiledCalls []byte // StateChangeCommitment captures a commitment over the state change (delta) StateChangeCommitment []byte + // Per-transaction state access footprint for EIP-7928 + StateAccessList *gethBAL.ConstructionBlockAccessList } // Invalid returns true if transaction has been rejected diff --git a/go.mod b/go.mod index b0c852c155f..8b59b0ce69a 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc github.com/dgraph-io/badger/v2 v2.2007.4 github.com/ef-ds/deque v1.0.4 - github.com/ethereum/go-ethereum v1.16.8 + github.com/ethereum/go-ethereum v1.17.4 github.com/fxamacker/cbor/v2 v2.9.2-0.20260331174317-a78e92ec038e github.com/gammazero/workerpool v1.1.3 github.com/gogo/protobuf v1.3.2 @@ -27,7 +27,7 @@ require ( github.com/gorilla/mux v1.8.1 github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 github.com/hashicorp/go-multierror v1.1.1 github.com/improbable-eng/grpc-web v0.15.0 github.com/ipfs/go-block-format v0.2.0 @@ -68,19 +68,19 @@ require ( github.com/spf13/viper v1.15.0 github.com/stretchr/testify v1.11.1 github.com/vmihailenco/msgpack/v4 v4.3.11 - go.opentelemetry.io/otel v1.39.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 - go.opentelemetry.io/otel/sdk v1.39.0 - go.opentelemetry.io/otel/trace v1.39.0 + go.opentelemetry.io/otel v1.43.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0 + go.opentelemetry.io/otel/sdk v1.43.0 + go.opentelemetry.io/otel/trace v1.43.0 go.uber.org/atomic v1.11.0 go.uber.org/multierr v1.11.0 - golang.org/x/crypto v0.47.0 + golang.org/x/crypto v0.51.0 golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 - golang.org/x/sync v0.19.0 - golang.org/x/sys v0.40.0 - golang.org/x/text v0.33.0 + golang.org/x/sync v0.20.0 + golang.org/x/sys v0.45.0 + golang.org/x/text v0.37.0 golang.org/x/time v0.14.0 - golang.org/x/tools v0.40.0 + golang.org/x/tools v0.44.0 google.golang.org/api v0.267.0 google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 google.golang.org/grpc v1.79.3 @@ -114,7 +114,7 @@ require ( github.com/sony/gobreaker v0.5.0 go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da - google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 + google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57 google.golang.org/genproto/googleapis/bytestream v0.0.0-20260203192932-546029d2fa20 gopkg.in/yaml.v2 v2.4.0 ) @@ -122,13 +122,18 @@ require ( require ( github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.5 // indirect - github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/crate-crypto/go-eth-kzg v1.5.0 // indirect github.com/emicklei/dot v1.6.2 // indirect - github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect + github.com/ethereum/c-kzg-4844/v2 v2.1.6 // indirect github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab // indirect github.com/ferranbt/fastssz v0.1.4 // indirect + github.com/fjl/jsonw v0.1.0 // indirect + github.com/pion/dtls/v3 v3.1.2 // indirect + github.com/pion/stun/v3 v3.1.2 // indirect + github.com/pion/transport/v4 v4.0.1 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc // indirect + golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa // indirect ) require ( @@ -178,7 +183,6 @@ require ( github.com/consensys/gnark-crypto v0.18.1 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect github.com/cskr/pubsub v1.0.2 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/deckarep/golang-set/v2 v2.6.0 // indirect @@ -189,7 +193,6 @@ require ( github.com/elastic/gosigar v0.14.3 // indirect github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect - github.com/ethereum/go-verkle v0.2.2 // indirect github.com/felixge/fgprof v0.9.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/filecoin-project/go-clock v0.1.0 // indirect @@ -259,7 +262,6 @@ require ( github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect github.com/miekg/dns v1.1.62 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect @@ -274,7 +276,6 @@ require ( github.com/multiformats/go-multistream v0.6.0 // indirect github.com/multiformats/go-varint v0.0.7 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/onflow/fixed-point v0.1.1 // indirect github.com/onflow/flow-ft/lib/go/contracts v1.1.1 // indirect github.com/onflow/flow-ft/lib/go/templates v1.1.1 // indirect @@ -289,7 +290,7 @@ require ( github.com/pion/dtls/v2 v2.2.12 // indirect github.com/pion/ice/v2 v2.3.37 // indirect github.com/pion/interceptor v0.1.37 // indirect - github.com/pion/logging v0.2.2 // indirect + github.com/pion/logging v0.2.4 // indirect github.com/pion/mdns v0.0.12 // indirect github.com/pion/randutil v0.1.0 // indirect github.com/pion/rtcp v1.2.15 // indirect @@ -298,7 +299,6 @@ require ( github.com/pion/sdp/v3 v3.0.9 // indirect github.com/pion/srtp/v2 v2.0.20 // indirect github.com/pion/stun v0.6.1 // indirect - github.com/pion/stun/v2 v2.0.0 // indirect github.com/pion/transport/v2 v2.2.10 // indirect github.com/pion/transport/v3 v3.0.7 // indirect github.com/pion/turn/v2 v2.1.6 // indirect @@ -325,7 +325,7 @@ require ( github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.4.2 // indirect - github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe // indirect + github.com/supranational/blst v0.3.16 // indirect github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect @@ -342,21 +342,21 @@ require ( go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 // indirect - go.opentelemetry.io/otel/metric v1.39.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.39.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect go.opentelemetry.io/proto/otlp v1.9.0 // indirect go.uber.org/dig v1.18.0 // indirect go.uber.org/fx v1.23.0 // indirect go.uber.org/mock v0.5.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/mod v0.31.0 // indirect - golang.org/x/net v0.49.0 // indirect + golang.org/x/mod v0.35.0 // indirect + golang.org/x/net v0.55.0 // indirect golang.org/x/oauth2 v0.35.0 // indirect - golang.org/x/term v0.39.0 // indirect + golang.org/x/term v0.43.0 // indirect gonum.org/v1/gonum v0.16.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260203192932-546029d2fa20 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.4.1 // indirect diff --git a/go.sum b/go.sum index 66efeead1da..ae313e2f14b 100644 --- a/go.sum +++ b/go.sum @@ -208,6 +208,8 @@ github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QH github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -285,10 +287,8 @@ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwc github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg= -github.com/crate-crypto/go-eth-kzg v1.4.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= -github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= -github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM= +github.com/crate-crypto/go-eth-kzg v1.5.0 h1:FYRiJMJG2iv+2Dy3fi14SVGjcPteZ5HAAUe4YWlJygc= +github.com/crate-crypto/go-eth-kzg v1.5.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= @@ -353,14 +353,12 @@ github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJP github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= -github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s= -github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs= +github.com/ethereum/c-kzg-4844/v2 v2.1.6 h1:xQymkKCT5E2Jiaoqf3v4wsNgjZLY0lRSkZn27fRjSls= +github.com/ethereum/c-kzg-4844/v2 v2.1.6/go.mod h1:8HMkUZ5JRv4hpw/XUrYWSQNAUzhHMg2UDb/U+5m+XNw= github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab h1:rvv6MJhy07IMfEKuARQ9TKojGqLVNxQajaXEp/BoqSk= github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab/go.mod h1:IuLm4IsPipXKF7CW5Lzf68PIbZ5yl7FFd74l/E0o9A8= -github.com/ethereum/go-ethereum v1.16.8 h1:LLLfkZWijhR5m6yrAXbdlTeXoqontH+Ga2f9igY7law= -github.com/ethereum/go-ethereum v1.16.8/go.mod h1:Fs6QebQbavneQTYcA39PEKv2+zIjX7rPUZ14DER46wk= -github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= -github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= +github.com/ethereum/go-ethereum v1.17.4 h1:uA4q+qiLp7QImBsjdRbINu8iX6OEVmj4DPc5/E5Fsxc= +github.com/ethereum/go-ethereum v1.17.4/go.mod h1:qMdgwqqRAen+aT8P7KKQKi0Qt6RzG4cfejVAbCpJgqA= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= @@ -370,6 +368,8 @@ github.com/ferranbt/fastssz v0.1.4 h1:OCDB+dYDEQDvAgtAGnTSidK1Pe2tW3nFV40XyMkTeD github.com/ferranbt/fastssz v0.1.4/go.mod h1:Ea3+oeoRGGLGm5shYAeDgu6PGUlcvQhE2fILyD9+tGg= github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU= github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs= +github.com/fjl/jsonw v0.1.0 h1:V3MyR79fjLpn/+bMgvegdGUIhoJOzjmqWcKDgcOmY1I= +github.com/fjl/jsonw v0.1.0/go.mod h1:2KMLevM6FXEJnfhtk7naXu9vZdVfOma1GlnGdPRlumU= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= @@ -620,8 +620,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpg github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 h1:NmZ1PKzSTQbuGHw9DGPFomqkkLWMC+vZCkfs+FHv1Vg= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3/go.mod h1:zQrxl1YP88HQlA6i9c63DSVPFklWpGX4OWAc9bFuaH4= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -839,7 +839,6 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -936,8 +935,6 @@ github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtb github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onflow/atree v0.16.1 h1:EmlaIz/GwQ39o5agAb2KT2ynt4SHRBkgMMWU5bp6iTs= github.com/onflow/atree v0.16.1/go.mod h1:hiOT/vKK/Zyw34Ru9OFbfEemC5NnQ7SHFB43bN9/4qI= github.com/onflow/boxo v0.0.0-20240201202436-f2477b92f483 h1:LpiQhTAfM9CAmNVEs0n//cBBgCg+vJSiIxTHYUklZ84= @@ -1026,12 +1023,15 @@ github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oL github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= +github.com/pion/dtls/v3 v3.1.2 h1:gqEdOUXLtCGW+afsBLO0LtDD8GnuBBjEy6HRtyofZTc= +github.com/pion/dtls/v3 v3.1.2/go.mod h1:Hw/igcX4pdY69z1Hgv5x7wJFrUkdgHwAn/Q/uo7YHRo= github.com/pion/ice/v2 v2.3.37 h1:ObIdaNDu1rCo7hObhs34YSBcO7fjslJMZV0ux+uZWh0= github.com/pion/ice/v2 v2.3.37/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ= github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI= github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y= -github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8= +github.com/pion/logging v0.2.4/go.mod h1:DffhXTKYdNZU+KtJ5pyQDjvOAh/GsNSyv1lbkFbe3so= github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= @@ -1050,8 +1050,8 @@ github.com/pion/srtp/v2 v2.0.20 h1:HNNny4s+OUmG280ETrCdgFndp4ufx3/uy85EawYEhTk= github.com/pion/srtp/v2 v2.0.20/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= -github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0= -github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ= +github.com/pion/stun/v3 v3.1.2 h1:86IhD8wFn6IDW4b1/0QzoQS+f5PeA8OHHRn8UZW5ErY= +github.com/pion/stun/v3 v3.1.2/go.mod h1:H7gDic7nNwlUL05pbs6T1dtaBehh/KjupxfWw3ZI7cA= github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= @@ -1060,6 +1060,8 @@ github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= +github.com/pion/transport/v4 v4.0.1 h1:sdROELU6BZ63Ab7FrOLn13M6YdJLY20wldXW2Cu2k8o= +github.com/pion/transport/v4 v4.0.1/go.mod h1:nEuEA4AD5lPdcIegQDpVLgNoDGreqM/YqmEx3ovP4jM= github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= @@ -1135,7 +1137,6 @@ github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -1260,8 +1261,8 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe h1:nbdqkIGOGfUAD54q1s2YBcBz/WcsxCO9HUQ4aGV5hUw= -github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/supranational/blst v0.3.16 h1:bTDadT+3fK497EvLdWRQEjiGnUtzJ7jjIUMF0jqwYhE= +github.com/supranational/blst v0.3.16/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= @@ -1347,24 +1348,24 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.6 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= -go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= -go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 h1:f0cb2XPmrqn4XMy9PNliTgRKJgS5WcL/u0/WRYGz4t0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0/go.mod h1:vnakAaFckOMiMtOIhFI2MNH4FYrZzXCYxmb1LlhoGz8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 h1:ao6Oe+wSebTlQ1OEht7jlYTzQKE+pnx/iNywFvTbuuI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0/go.mod h1:u3T6vz0gh/NVzgDgiwkgLxpsSF6PaPmo2il0apGJbls= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0 h1:mq/Qcf28TWz719lE3/hMB4KkyDuLJIvgJnFGcd0kEUI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0/go.mod h1:yk5LXEYhsL2htyDNJbEq7fWzNEigeEdV5xBF/Y+kAv0= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 h1:VhlEQAPp9R1ktYfrPk5SOryw1e9LDDTZCbIPFrho0ec= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0/go.mod h1:kB3ufRbfU+CQ4MlUcqtW8Z7YEOBeK2DJ6CmR5rYYF3E= -go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= -go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= -go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= -go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= -go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= -go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= -go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= -go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= @@ -1423,8 +1424,8 @@ golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= -golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= +golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= +golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1466,8 +1467,8 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= -golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= +golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= +golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1533,8 +1534,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= -golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1572,8 +1573,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1679,10 +1680,10 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= -golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc h1:bH6xUXay0AIFMElXG2rQ4uiE+7ncwtiOdPfYK1NK2XA= -golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc/go.mod h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa h1:efT73AJZfAAUV7SOip6pWGkwJDzIGiKBZGVzHYa+ve4= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa/go.mod h1:kHjTxDEnAu6/Nl9lDkzjWpR+bmKfxeiRuSDlsMb70gE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -1690,8 +1691,8 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= -golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= +golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= +golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1706,8 +1707,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= -golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1778,8 +1779,8 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= -golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= +golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= +golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1929,12 +1930,12 @@ google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 h1:VQZ/yAbAtjkHgH80teYd2em3xtIkkHd7ZhqfH2N9CsM= google.golang.org/genproto v0.0.0-20260128011058-8636f8732409/go.mod h1:rxKD3IEILWEu3P44seeNOAwZN4SaoKaQ/2eTg4mM6EM= -google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 h1:7ei4lp52gK1uSejlA8AZl5AJjeLUOHBQscRQZUgAcu0= -google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20/go.mod h1:ZdbssH/1SOVnjnDlXzxDHK2MCidiqXtbYccJNzNYPEE= +google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57 h1:JLQynH/LBHfCTSbDWl+py8C+Rg/k1OVH3xfcaiANuF0= +google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57/go.mod h1:kSJwQxqmFXeo79zOmbrALdflXQeAYcUbgS7PbpMknCY= google.golang.org/genproto/googleapis/bytestream v0.0.0-20260203192932-546029d2fa20 h1:zQTtWukWCqGTV6Pt60SqvPGnEi2CE3PeeIRlu4SYgAc= google.golang.org/genproto/googleapis/bytestream v0.0.0-20260203192932-546029d2fa20/go.mod h1:Tej9lWiwVvQJP+b43pjJIsr/3mZycXWCIyoiXmbFf40= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260203192932-546029d2fa20 h1:Jr5R2J6F6qWyzINc+4AM8t5pfUz6beZpHp678GNrMbE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260203192932-546029d2fa20/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57 h1:mWPCjDEyshlQYzBpMNHaEof6UX1PmHcaUODUywQ0uac= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= diff --git a/insecure/go.mod b/insecure/go.mod index 9639a6efb56..57824ebf5df 100644 --- a/insecure/go.mod +++ b/insecure/go.mod @@ -61,6 +61,7 @@ require ( github.com/bits-and-blooms/bitset v1.24.4 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect @@ -76,8 +77,7 @@ require ( github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect + github.com/crate-crypto/go-eth-kzg v1.5.0 // indirect github.com/cskr/pubsub v1.0.2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect @@ -94,13 +94,13 @@ require ( github.com/emicklei/dot v1.6.2 // indirect github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect - github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect + github.com/ethereum/c-kzg-4844/v2 v2.1.6 // indirect github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab // indirect - github.com/ethereum/go-ethereum v1.16.8 // indirect - github.com/ethereum/go-verkle v0.2.2 // indirect + github.com/ethereum/go-ethereum v1.17.4 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/ferranbt/fastssz v0.1.4 // indirect github.com/filecoin-project/go-clock v0.1.0 // indirect + github.com/fjl/jsonw v0.1.0 // indirect github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect @@ -137,7 +137,7 @@ require ( github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect @@ -196,7 +196,6 @@ require ( github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect github.com/miekg/dns v1.1.62 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect @@ -214,7 +213,6 @@ require ( github.com/multiformats/go-multistream v0.6.0 // indirect github.com/multiformats/go-varint v0.0.7 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/onflow/atree v0.16.1 // indirect github.com/onflow/cadence v1.10.4 // indirect github.com/onflow/fixed-point v0.1.1 // indirect @@ -239,9 +237,10 @@ require ( github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pion/datachannel v1.5.10 // indirect github.com/pion/dtls/v2 v2.2.12 // indirect + github.com/pion/dtls/v3 v3.1.2 // indirect github.com/pion/ice/v2 v2.3.37 // indirect github.com/pion/interceptor v0.1.37 // indirect - github.com/pion/logging v0.2.2 // indirect + github.com/pion/logging v0.2.4 // indirect github.com/pion/mdns v0.0.12 // indirect github.com/pion/randutil v0.1.0 // indirect github.com/pion/rtcp v1.2.15 // indirect @@ -250,9 +249,10 @@ require ( github.com/pion/sdp/v3 v3.0.9 // indirect github.com/pion/srtp/v2 v2.0.20 // indirect github.com/pion/stun v0.6.1 // indirect - github.com/pion/stun/v2 v2.0.0 // indirect + github.com/pion/stun/v3 v3.1.2 // indirect github.com/pion/transport/v2 v2.2.10 // indirect github.com/pion/transport/v3 v3.0.7 // indirect + github.com/pion/transport/v4 v4.0.1 // indirect github.com/pion/turn/v2 v2.1.6 // indirect github.com/pion/webrtc/v3 v3.3.5 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -287,7 +287,7 @@ require ( github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.4.2 // indirect - github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe // indirect + github.com/supranational/blst v0.3.16 // indirect github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect @@ -305,13 +305,13 @@ require ( go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect - go.opentelemetry.io/otel v1.39.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect - go.opentelemetry.io/otel/metric v1.39.0 // indirect - go.opentelemetry.io/otel/sdk v1.39.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.39.0 // indirect - go.opentelemetry.io/otel/trace v1.39.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect go.opentelemetry.io/proto/otlp v1.9.0 // indirect go.uber.org/dig v1.18.0 // indirect go.uber.org/fx v1.23.0 // indirect @@ -319,25 +319,25 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.47.0 // indirect + golang.org/x/crypto v0.51.0 // indirect golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 // indirect - golang.org/x/mod v0.31.0 // indirect - golang.org/x/net v0.49.0 // indirect + golang.org/x/mod v0.35.0 // indirect + golang.org/x/net v0.55.0 // indirect golang.org/x/oauth2 v0.35.0 // indirect - golang.org/x/sync v0.19.0 // indirect - golang.org/x/sys v0.40.0 // indirect - golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc // indirect - golang.org/x/term v0.39.0 // indirect - golang.org/x/text v0.33.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.45.0 // indirect + golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa // indirect + golang.org/x/term v0.43.0 // indirect + golang.org/x/text v0.37.0 // indirect golang.org/x/time v0.14.0 // indirect - golang.org/x/tools v0.40.0 // indirect + golang.org/x/tools v0.44.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gonum.org/v1/gonum v0.16.0 // indirect google.golang.org/api v0.267.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260203192932-546029d2fa20 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57 // indirect google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/insecure/go.sum b/insecure/go.sum index 93b7ffaec4e..85479adfcbf 100644 --- a/insecure/go.sum +++ b/insecure/go.sum @@ -189,6 +189,8 @@ github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QH github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -260,10 +262,8 @@ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwc github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg= -github.com/crate-crypto/go-eth-kzg v1.4.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= -github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= -github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM= +github.com/crate-crypto/go-eth-kzg v1.5.0 h1:FYRiJMJG2iv+2Dy3fi14SVGjcPteZ5HAAUe4YWlJygc= +github.com/crate-crypto/go-eth-kzg v1.5.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= @@ -324,14 +324,12 @@ github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJP github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= -github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s= -github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs= +github.com/ethereum/c-kzg-4844/v2 v2.1.6 h1:xQymkKCT5E2Jiaoqf3v4wsNgjZLY0lRSkZn27fRjSls= +github.com/ethereum/c-kzg-4844/v2 v2.1.6/go.mod h1:8HMkUZ5JRv4hpw/XUrYWSQNAUzhHMg2UDb/U+5m+XNw= github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab h1:rvv6MJhy07IMfEKuARQ9TKojGqLVNxQajaXEp/BoqSk= github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab/go.mod h1:IuLm4IsPipXKF7CW5Lzf68PIbZ5yl7FFd74l/E0o9A8= -github.com/ethereum/go-ethereum v1.16.8 h1:LLLfkZWijhR5m6yrAXbdlTeXoqontH+Ga2f9igY7law= -github.com/ethereum/go-ethereum v1.16.8/go.mod h1:Fs6QebQbavneQTYcA39PEKv2+zIjX7rPUZ14DER46wk= -github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= -github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= +github.com/ethereum/go-ethereum v1.17.4 h1:uA4q+qiLp7QImBsjdRbINu8iX6OEVmj4DPc5/E5Fsxc= +github.com/ethereum/go-ethereum v1.17.4/go.mod h1:qMdgwqqRAen+aT8P7KKQKi0Qt6RzG4cfejVAbCpJgqA= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= @@ -339,6 +337,8 @@ github.com/ferranbt/fastssz v0.1.4 h1:OCDB+dYDEQDvAgtAGnTSidK1Pe2tW3nFV40XyMkTeD github.com/ferranbt/fastssz v0.1.4/go.mod h1:Ea3+oeoRGGLGm5shYAeDgu6PGUlcvQhE2fILyD9+tGg= github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU= github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs= +github.com/fjl/jsonw v0.1.0 h1:V3MyR79fjLpn/+bMgvegdGUIhoJOzjmqWcKDgcOmY1I= +github.com/fjl/jsonw v0.1.0/go.mod h1:2KMLevM6FXEJnfhtk7naXu9vZdVfOma1GlnGdPRlumU= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= @@ -573,8 +573,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 h1:NmZ1PKzSTQbuGHw9DGPFomqkkLWMC+vZCkfs+FHv1Vg= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3/go.mod h1:zQrxl1YP88HQlA6i9c63DSVPFklWpGX4OWAc9bFuaH4= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -791,7 +791,6 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -886,8 +885,6 @@ github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtb github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onflow/atree v0.16.1 h1:EmlaIz/GwQ39o5agAb2KT2ynt4SHRBkgMMWU5bp6iTs= github.com/onflow/atree v0.16.1/go.mod h1:hiOT/vKK/Zyw34Ru9OFbfEemC5NnQ7SHFB43bN9/4qI= github.com/onflow/boxo v0.0.0-20240201202436-f2477b92f483 h1:LpiQhTAfM9CAmNVEs0n//cBBgCg+vJSiIxTHYUklZ84= @@ -974,12 +971,15 @@ github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oL github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= +github.com/pion/dtls/v3 v3.1.2 h1:gqEdOUXLtCGW+afsBLO0LtDD8GnuBBjEy6HRtyofZTc= +github.com/pion/dtls/v3 v3.1.2/go.mod h1:Hw/igcX4pdY69z1Hgv5x7wJFrUkdgHwAn/Q/uo7YHRo= github.com/pion/ice/v2 v2.3.37 h1:ObIdaNDu1rCo7hObhs34YSBcO7fjslJMZV0ux+uZWh0= github.com/pion/ice/v2 v2.3.37/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ= github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI= github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y= -github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8= +github.com/pion/logging v0.2.4/go.mod h1:DffhXTKYdNZU+KtJ5pyQDjvOAh/GsNSyv1lbkFbe3so= github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= @@ -998,8 +998,8 @@ github.com/pion/srtp/v2 v2.0.20 h1:HNNny4s+OUmG280ETrCdgFndp4ufx3/uy85EawYEhTk= github.com/pion/srtp/v2 v2.0.20/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= -github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0= -github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ= +github.com/pion/stun/v3 v3.1.2 h1:86IhD8wFn6IDW4b1/0QzoQS+f5PeA8OHHRn8UZW5ErY= +github.com/pion/stun/v3 v3.1.2/go.mod h1:H7gDic7nNwlUL05pbs6T1dtaBehh/KjupxfWw3ZI7cA= github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= @@ -1008,6 +1008,8 @@ github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= +github.com/pion/transport/v4 v4.0.1 h1:sdROELU6BZ63Ab7FrOLn13M6YdJLY20wldXW2Cu2k8o= +github.com/pion/transport/v4 v4.0.1/go.mod h1:nEuEA4AD5lPdcIegQDpVLgNoDGreqM/YqmEx3ovP4jM= github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= @@ -1081,7 +1083,6 @@ github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -1204,8 +1205,8 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe h1:nbdqkIGOGfUAD54q1s2YBcBz/WcsxCO9HUQ4aGV5hUw= -github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/supranational/blst v0.3.16 h1:bTDadT+3fK497EvLdWRQEjiGnUtzJ7jjIUMF0jqwYhE= +github.com/supranational/blst v0.3.16/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= @@ -1290,22 +1291,22 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.6 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= -go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= -go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 h1:f0cb2XPmrqn4XMy9PNliTgRKJgS5WcL/u0/WRYGz4t0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0/go.mod h1:vnakAaFckOMiMtOIhFI2MNH4FYrZzXCYxmb1LlhoGz8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 h1:ao6Oe+wSebTlQ1OEht7jlYTzQKE+pnx/iNywFvTbuuI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0/go.mod h1:u3T6vz0gh/NVzgDgiwkgLxpsSF6PaPmo2il0apGJbls= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0 h1:mq/Qcf28TWz719lE3/hMB4KkyDuLJIvgJnFGcd0kEUI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0/go.mod h1:yk5LXEYhsL2htyDNJbEq7fWzNEigeEdV5xBF/Y+kAv0= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw= -go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= -go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= -go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= -go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= -go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= -go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= -go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= -go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1363,8 +1364,8 @@ golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= -golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= +golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= +golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1405,8 +1406,8 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= -golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= +golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= +golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1465,8 +1466,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= -golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1494,8 +1495,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1581,10 +1582,10 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= -golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc h1:bH6xUXay0AIFMElXG2rQ4uiE+7ncwtiOdPfYK1NK2XA= -golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc/go.mod h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa h1:efT73AJZfAAUV7SOip6pWGkwJDzIGiKBZGVzHYa+ve4= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa/go.mod h1:kHjTxDEnAu6/Nl9lDkzjWpR+bmKfxeiRuSDlsMb70gE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -1592,8 +1593,8 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= -golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= +golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= +golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1607,8 +1608,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= -golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1675,8 +1676,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= -golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= +golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= +golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1766,12 +1767,12 @@ google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 h1:VQZ/yAbAtjkHgH80teYd2em3xtIkkHd7ZhqfH2N9CsM= google.golang.org/genproto v0.0.0-20260128011058-8636f8732409/go.mod h1:rxKD3IEILWEu3P44seeNOAwZN4SaoKaQ/2eTg4mM6EM= -google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 h1:7ei4lp52gK1uSejlA8AZl5AJjeLUOHBQscRQZUgAcu0= -google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20/go.mod h1:ZdbssH/1SOVnjnDlXzxDHK2MCidiqXtbYccJNzNYPEE= +google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57 h1:JLQynH/LBHfCTSbDWl+py8C+Rg/k1OVH3xfcaiANuF0= +google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57/go.mod h1:kSJwQxqmFXeo79zOmbrALdflXQeAYcUbgS7PbpMknCY= google.golang.org/genproto/googleapis/bytestream v0.0.0-20260203192932-546029d2fa20 h1:zQTtWukWCqGTV6Pt60SqvPGnEi2CE3PeeIRlu4SYgAc= google.golang.org/genproto/googleapis/bytestream v0.0.0-20260203192932-546029d2fa20/go.mod h1:Tej9lWiwVvQJP+b43pjJIsr/3mZycXWCIyoiXmbFf40= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260203192932-546029d2fa20 h1:Jr5R2J6F6qWyzINc+4AM8t5pfUz6beZpHp678GNrMbE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260203192932-546029d2fa20/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57 h1:mWPCjDEyshlQYzBpMNHaEof6UX1PmHcaUODUywQ0uac= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= diff --git a/integration/go.mod b/integration/go.mod index ce1dfdee698..e970d59d13e 100644 --- a/integration/go.mod +++ b/integration/go.mod @@ -11,7 +11,7 @@ require ( github.com/coreos/go-semver v0.3.0 github.com/docker/docker v28.5.2+incompatible github.com/docker/go-connections v0.5.0 - github.com/ethereum/go-ethereum v1.16.8 + github.com/ethereum/go-ethereum v1.17.4 github.com/go-git/go-git/v5 v5.11.0 github.com/go-yaml/yaml v2.1.0+incompatible github.com/gorilla/websocket v1.5.3 @@ -42,7 +42,7 @@ require ( go.uber.org/atomic v1.11.0 go.uber.org/mock v0.5.0 golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 - golang.org/x/sync v0.19.0 + golang.org/x/sync v0.20.0 google.golang.org/grpc v1.79.3 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 @@ -92,7 +92,6 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.24.4 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect - github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect @@ -112,8 +111,7 @@ require ( github.com/containerd/fifo v1.1.0 // indirect github.com/containerd/log v0.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect + github.com/crate-crypto/go-eth-kzg v1.5.0 // indirect github.com/cskr/pubsub v1.0.2 // indirect github.com/cyphar/filepath-securejoin v0.5.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect @@ -135,12 +133,12 @@ require ( github.com/emirpasic/gods v1.18.1 // indirect github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect - github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect + github.com/ethereum/c-kzg-4844/v2 v2.1.6 // indirect github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab // indirect - github.com/ethereum/go-verkle v0.2.2 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/ferranbt/fastssz v0.1.4 // indirect github.com/filecoin-project/go-clock v0.1.0 // indirect + github.com/fjl/jsonw v0.1.0 // indirect github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect @@ -182,7 +180,7 @@ require ( github.com/gorilla/mux v1.8.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect @@ -241,7 +239,6 @@ require ( github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect github.com/miekg/dns v1.1.62 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect @@ -266,7 +263,6 @@ require ( github.com/multiformats/go-multistream v0.6.0 // indirect github.com/multiformats/go-varint v0.0.7 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/onflow/atree v0.16.1 // indirect github.com/onflow/fixed-point v0.1.1 // indirect github.com/onflow/flow-evm-bridge v0.2.1 // indirect @@ -286,9 +282,10 @@ require ( github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pion/datachannel v1.5.10 // indirect github.com/pion/dtls/v2 v2.2.12 // indirect + github.com/pion/dtls/v3 v3.1.2 // indirect github.com/pion/ice/v2 v2.3.37 // indirect github.com/pion/interceptor v0.1.37 // indirect - github.com/pion/logging v0.2.2 // indirect + github.com/pion/logging v0.2.4 // indirect github.com/pion/mdns v0.0.12 // indirect github.com/pion/randutil v0.1.0 // indirect github.com/pion/rtcp v1.2.15 // indirect @@ -297,9 +294,10 @@ require ( github.com/pion/sdp/v3 v3.0.9 // indirect github.com/pion/srtp/v2 v2.0.20 // indirect github.com/pion/stun v0.6.1 // indirect - github.com/pion/stun/v2 v2.0.0 // indirect + github.com/pion/stun/v3 v3.1.2 // indirect github.com/pion/transport/v2 v2.2.10 // indirect github.com/pion/transport/v3 v3.0.7 // indirect + github.com/pion/transport/v4 v4.0.1 // indirect github.com/pion/turn/v2 v2.1.6 // indirect github.com/pion/webrtc/v3 v3.3.5 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect @@ -336,7 +334,7 @@ require ( github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.4.2 // indirect - github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe // indirect + github.com/supranational/blst v0.3.16 // indirect github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect @@ -356,36 +354,36 @@ require ( go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 // indirect - go.opentelemetry.io/otel v1.40.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect - go.opentelemetry.io/otel/metric v1.40.0 // indirect - go.opentelemetry.io/otel/sdk v1.40.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.40.0 // indirect - go.opentelemetry.io/otel/trace v1.40.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect go.opentelemetry.io/proto/otlp v1.9.0 // indirect go.uber.org/dig v1.18.0 // indirect go.uber.org/fx v1.23.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.47.0 // indirect - golang.org/x/mod v0.31.0 // indirect - golang.org/x/net v0.49.0 // indirect + golang.org/x/crypto v0.51.0 // indirect + golang.org/x/mod v0.35.0 // indirect + golang.org/x/net v0.55.0 // indirect golang.org/x/oauth2 v0.35.0 // indirect - golang.org/x/sys v0.40.0 // indirect - golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc // indirect - golang.org/x/term v0.39.0 // indirect - golang.org/x/text v0.33.0 // indirect + golang.org/x/sys v0.45.0 // indirect + golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa // indirect + golang.org/x/term v0.43.0 // indirect + golang.org/x/text v0.37.0 // indirect golang.org/x/time v0.14.0 // indirect - golang.org/x/tools v0.40.0 // indirect + golang.org/x/tools v0.44.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gonum.org/v1/gonum v0.16.0 // indirect google.golang.org/api v0.267.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260203192932-546029d2fa20 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57 // indirect google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect diff --git a/integration/go.sum b/integration/go.sum index 6e415370283..90689749358 100644 --- a/integration/go.sum +++ b/integration/go.sum @@ -147,8 +147,6 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -218,10 +216,8 @@ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwc github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg= -github.com/crate-crypto/go-eth-kzg v1.4.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= -github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= -github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM= +github.com/crate-crypto/go-eth-kzg v1.5.0 h1:FYRiJMJG2iv+2Dy3fi14SVGjcPteZ5HAAUe4YWlJygc= +github.com/crate-crypto/go-eth-kzg v1.5.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= @@ -292,20 +288,20 @@ github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJP github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= -github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s= -github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs= +github.com/ethereum/c-kzg-4844/v2 v2.1.6 h1:xQymkKCT5E2Jiaoqf3v4wsNgjZLY0lRSkZn27fRjSls= +github.com/ethereum/c-kzg-4844/v2 v2.1.6/go.mod h1:8HMkUZ5JRv4hpw/XUrYWSQNAUzhHMg2UDb/U+5m+XNw= github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab h1:rvv6MJhy07IMfEKuARQ9TKojGqLVNxQajaXEp/BoqSk= github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab/go.mod h1:IuLm4IsPipXKF7CW5Lzf68PIbZ5yl7FFd74l/E0o9A8= -github.com/ethereum/go-ethereum v1.16.8 h1:LLLfkZWijhR5m6yrAXbdlTeXoqontH+Ga2f9igY7law= -github.com/ethereum/go-ethereum v1.16.8/go.mod h1:Fs6QebQbavneQTYcA39PEKv2+zIjX7rPUZ14DER46wk= -github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= -github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= +github.com/ethereum/go-ethereum v1.17.4 h1:uA4q+qiLp7QImBsjdRbINu8iX6OEVmj4DPc5/E5Fsxc= +github.com/ethereum/go-ethereum v1.17.4/go.mod h1:qMdgwqqRAen+aT8P7KKQKi0Qt6RzG4cfejVAbCpJgqA= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/ferranbt/fastssz v0.1.4 h1:OCDB+dYDEQDvAgtAGnTSidK1Pe2tW3nFV40XyMkTeDY= github.com/ferranbt/fastssz v0.1.4/go.mod h1:Ea3+oeoRGGLGm5shYAeDgu6PGUlcvQhE2fILyD9+tGg= github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU= github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs= +github.com/fjl/jsonw v0.1.0 h1:V3MyR79fjLpn/+bMgvegdGUIhoJOzjmqWcKDgcOmY1I= +github.com/fjl/jsonw v0.1.0/go.mod h1:2KMLevM6FXEJnfhtk7naXu9vZdVfOma1GlnGdPRlumU= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= @@ -487,8 +483,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92Bcuy github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 h1:NmZ1PKzSTQbuGHw9DGPFomqkkLWMC+vZCkfs+FHv1Vg= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3/go.mod h1:zQrxl1YP88HQlA6i9c63DSVPFklWpGX4OWAc9bFuaH4= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -662,7 +658,6 @@ github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -746,8 +741,6 @@ github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onflow/atree v0.16.1 h1:EmlaIz/GwQ39o5agAb2KT2ynt4SHRBkgMMWU5bp6iTs= github.com/onflow/atree v0.16.1/go.mod h1:hiOT/vKK/Zyw34Ru9OFbfEemC5NnQ7SHFB43bN9/4qI= github.com/onflow/boxo v0.0.0-20240201202436-f2477b92f483 h1:LpiQhTAfM9CAmNVEs0n//cBBgCg+vJSiIxTHYUklZ84= @@ -826,12 +819,15 @@ github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oL github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= +github.com/pion/dtls/v3 v3.1.2 h1:gqEdOUXLtCGW+afsBLO0LtDD8GnuBBjEy6HRtyofZTc= +github.com/pion/dtls/v3 v3.1.2/go.mod h1:Hw/igcX4pdY69z1Hgv5x7wJFrUkdgHwAn/Q/uo7YHRo= github.com/pion/ice/v2 v2.3.37 h1:ObIdaNDu1rCo7hObhs34YSBcO7fjslJMZV0ux+uZWh0= github.com/pion/ice/v2 v2.3.37/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ= github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI= github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y= -github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8= +github.com/pion/logging v0.2.4/go.mod h1:DffhXTKYdNZU+KtJ5pyQDjvOAh/GsNSyv1lbkFbe3so= github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= @@ -850,8 +846,8 @@ github.com/pion/srtp/v2 v2.0.20 h1:HNNny4s+OUmG280ETrCdgFndp4ufx3/uy85EawYEhTk= github.com/pion/srtp/v2 v2.0.20/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= -github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0= -github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ= +github.com/pion/stun/v3 v3.1.2 h1:86IhD8wFn6IDW4b1/0QzoQS+f5PeA8OHHRn8UZW5ErY= +github.com/pion/stun/v3 v3.1.2/go.mod h1:H7gDic7nNwlUL05pbs6T1dtaBehh/KjupxfWw3ZI7cA= github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= @@ -860,6 +856,8 @@ github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= +github.com/pion/transport/v4 v4.0.1 h1:sdROELU6BZ63Ab7FrOLn13M6YdJLY20wldXW2Cu2k8o= +github.com/pion/transport/v4 v4.0.1/go.mod h1:nEuEA4AD5lPdcIegQDpVLgNoDGreqM/YqmEx3ovP4jM= github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= @@ -922,7 +920,6 @@ github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6 github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -1036,8 +1033,8 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe h1:nbdqkIGOGfUAD54q1s2YBcBz/WcsxCO9HUQ4aGV5hUw= -github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/supranational/blst v0.3.16 h1:bTDadT+3fK497EvLdWRQEjiGnUtzJ7jjIUMF0jqwYhE= +github.com/supranational/blst v0.3.16/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= @@ -1105,24 +1102,24 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.6 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 h1:7iP2uCb7sGddAr30RRS6xjKy7AZ2JtTOPA3oolgVSw8= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0/go.mod h1:c7hN3ddxs/z6q9xwvfLPk+UHlWRQyaeR1LdgfL/66l0= -go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= -go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 h1:f0cb2XPmrqn4XMy9PNliTgRKJgS5WcL/u0/WRYGz4t0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0/go.mod h1:vnakAaFckOMiMtOIhFI2MNH4FYrZzXCYxmb1LlhoGz8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.40.0 h1:wVZXIWjQSeSmMoxF74LzAnpVQOAFDo3pPji9Y4SOFKc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.40.0/go.mod h1:khvBS2IggMFNwZK/6lEeHg/W57h/IX6J4URh57fuI40= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 h1:ao6Oe+wSebTlQ1OEht7jlYTzQKE+pnx/iNywFvTbuuI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0/go.mod h1:u3T6vz0gh/NVzgDgiwkgLxpsSF6PaPmo2il0apGJbls= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0 h1:mq/Qcf28TWz719lE3/hMB4KkyDuLJIvgJnFGcd0kEUI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0/go.mod h1:yk5LXEYhsL2htyDNJbEq7fWzNEigeEdV5xBF/Y+kAv0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0 h1:inYW9ZhgqiDqh6BioM7DVHHzEGVq76Db5897WLGZ5Go= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0/go.mod h1:Izur+Wt8gClgMJqO/cZ8wdeeMryJ/xxiOVgFSSfpDTY= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw= -go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= -go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= -go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= -go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= -go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= -go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= -go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= -go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1172,8 +1169,8 @@ golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= -golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= +golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= +golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo= golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= @@ -1190,8 +1187,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= -golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= +golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= +golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1227,8 +1224,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= -golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1246,8 +1243,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1297,10 +1294,10 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= -golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc h1:bH6xUXay0AIFMElXG2rQ4uiE+7ncwtiOdPfYK1NK2XA= -golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc/go.mod h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa h1:efT73AJZfAAUV7SOip6pWGkwJDzIGiKBZGVzHYa+ve4= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa/go.mod h1:kHjTxDEnAu6/Nl9lDkzjWpR+bmKfxeiRuSDlsMb70gE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -1310,8 +1307,8 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= -golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= +golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= +golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -1325,8 +1322,8 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= -golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1353,8 +1350,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= -golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= +golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= +golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1384,12 +1381,12 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 h1:VQZ/yAbAtjkHgH80teYd2em3xtIkkHd7ZhqfH2N9CsM= google.golang.org/genproto v0.0.0-20260128011058-8636f8732409/go.mod h1:rxKD3IEILWEu3P44seeNOAwZN4SaoKaQ/2eTg4mM6EM= -google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 h1:7ei4lp52gK1uSejlA8AZl5AJjeLUOHBQscRQZUgAcu0= -google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20/go.mod h1:ZdbssH/1SOVnjnDlXzxDHK2MCidiqXtbYccJNzNYPEE= +google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57 h1:JLQynH/LBHfCTSbDWl+py8C+Rg/k1OVH3xfcaiANuF0= +google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57/go.mod h1:kSJwQxqmFXeo79zOmbrALdflXQeAYcUbgS7PbpMknCY= google.golang.org/genproto/googleapis/bytestream v0.0.0-20260203192932-546029d2fa20 h1:zQTtWukWCqGTV6Pt60SqvPGnEi2CE3PeeIRlu4SYgAc= google.golang.org/genproto/googleapis/bytestream v0.0.0-20260203192932-546029d2fa20/go.mod h1:Tej9lWiwVvQJP+b43pjJIsr/3mZycXWCIyoiXmbFf40= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260203192932-546029d2fa20 h1:Jr5R2J6F6qWyzINc+4AM8t5pfUz6beZpHp678GNrMbE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260203192932-546029d2fa20/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57 h1:mWPCjDEyshlQYzBpMNHaEof6UX1PmHcaUODUywQ0uac= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=